Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android数据绑定双向不工作_Java_Android_Pojo_2 Way Object Databinding_Android Databinding - Fatal编程技术网

Java Android数据绑定双向不工作

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

我正在尝试使用双向数据绑定来编辑用户数据。我能够在视图中显示POJO内容,但用户所做的更改无法用POJO捕捉回来

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()。