根据此注释和Android数据绑定教程,在数据绑定时,我应该有一个context
可用变量:
会根据需要生成一个特殊的名为context的变量,用于绑定表达式。context的值是根视图的getContext()中的Context。上下文变量将被具有该名称的显式变量声明覆盖。
我正在使用扩展类BaseObservable
来设置数据,但是无论我如何尝试context
在@Bindable
方法中引入变量,都会出现编译时错误:
java.lang.RuntimeException:故障,有关详细信息,请参见日志。与方法关联的@Bindable必须遵循JavaBeans约定getStyledName(android.content.Context)
据我所知,我遵循JavaBeans约定。我已经在BrUtil中将错误跟踪到了这一行,但这也没有给我太多帮助。
我尝试更改方法和参数名称,尝试添加<variable>
forcontext
和<import>
for android.content.Context
,但是没有任何区别。我的User.java
下面有两种@Bindable
方法,裸方法getName()
可以正常工作,但尝试使用该context
变量的方法却不行,因此我也不认为其余的数据绑定设置也有问题。
相关代码:
activity_main.xml
:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable name="user" type="com.kasra.androidsandbox.User" />
</data>
<LinearLayout
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/main_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
<TextView
android:id="@+id/main_textview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="@{user.getStyledName(context)}" />
</LinearLayout>
</layout>
User.java
:
public class User extends BaseObservable {
private String name;
public User(String name) {
this.name = name;
}
@Bindable
public String getName() {
return this.name;
}
@Bindable
public CharSequence getStyledName(Context ctx) {
int color = ctx.getResources().getColor(R.color.branded_pink);
Spannable textSpan = new SpannableString(name);
textSpan.setSpan(new ForegroundColorSpan(color), 0, textSpan.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return textSpan;
}
}
MainActivity.java
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("Kasra");
binding.setUser(user);
Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar);
setSupportActionBar(toolbar);
}
我不知道这是错误还是预期的行为,但是我自己观察到了这种行为,因此您并不疯狂。
一种解决方法是创建一种@Bindable
在用户中未标记的方法-需要上下文的方法。此方法不受JavaBeans命名约定的约束。
重要说明:为了确保已正确更新,应将可能更改的任何@Bindable字段作为输入。
User.java
public class User extends BaseObservable {
private String name;
public User(String name) {
this.name = name;
}
@Bindable
public String getName() {
return this.name;
}
public CharSequence getStyledName(Context ctx, String name) {
// construct styled name here
}
}
并在您的布局中:
<TextView
android:id="@+id/main_textview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="@{user.getStyledName(context, user.name)}" />
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句