Java Android数据绑定双向不工作
我正在尝试使用双向数据绑定来编辑用户数据。我能够在视图中显示POJO内容,但用户所做的更改无法用POJO捕捉回来Java Android数据绑定双向不工作,java,android,pojo,2-way-object-databinding,android-databinding,Java,Android,Pojo,2 Way Object Databinding,Android Databinding,我正在尝试使用双向数据绑定来编辑用户数据。我能够在视图中显示POJO内容,但用户所做的更改无法用POJO捕捉回来 public class MainActivity extends AppCompatActivity { ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstan
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User();
user.setFirstName("first a");
user.setLastName("last b");
binding.setUser(user);
}
public void Click(View v){
//ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
User user = binding.getUser();
Toast.makeText(this,user.getFirstName(),Toast.LENGTH_LONG).show();
}
}
我已经尝试为user
使用全局变量,binding
。但当我点击按钮时,它总是显示“第一个a”。User.java的定义是:
public class User extends BaseObservable{
private String firstName;
private String lastName;
@Bindable
public String getFirstName(){ return firstName;}
public void setFirstName(String first) {
firstName = first;
notifyPropertyChanged(com.example.ks.myapplication.BR.firstName);
}
@Bindable
public String getLastName(){ return lastName;}
public void setLastName(String last) {
lastName = last;
notifyPropertyChanged(com.example.ks.myapplication.BR.lastName);
}
}
还有XML:在这里,我试图在文本视图和单击按钮时立即显示更改
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.ks.myapplication.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText2"
android:text="@{user.firstName}" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:text="@{user.lastName}" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button"
android:layout_gravity="center_horizontal"
android:onClick="Click" />
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
我还缺少什么吗?双向数据绑定功能仍在实施中。
您必须将项目升级到最新的alpha版本(com.android.tools.build:gradle:2.1.0-alpha3),并且必须使用
@={..}
类型表达式详细信息请参见:您的POJO有
名字和姓氏的私有字段-您不应该使用访问器和变异器方法吗?我以前从未使用过XML数据绑定,但是如果您可以访问私有字段,这似乎很糟糕。来源:如果你看一下,它们是示例链接中的public
变量,而不是您的POJO中的private
变量?它解释了如果使用private
字段,您需要使用accessor
方法。我想您指的是数据对象标题下的第一段代码。下面是另一个代码,后面是描述:从数据绑定的角度来看,这两个类是等价的。TextView的android:text属性使用的表达式@{user.firstName}将访问前一个类中的firstName字段和后一个类中的getFirstName()方法。或者,如果该方法存在,它也将解析为firstName()。