数据绑定API如何设置字符串

时间:2015-09-04 12:16:15

标签: android data-binding android-databinding

当我在android中使用Data Binding API时,我想删除像findViewById这样的样板代码。

但是我有一个简单的login_fragment,它需要user-nameuser-pw。点击Sign Up后,它会获得相应的字符串并将其写入我的User-Class

public class User extends BaseObservable {
    private String user;
    private String pw;

    public User() {}

    @Bindable
    public String getUser() {
        return user;
    }

    @Bindable
    public String getPw() {
        return pw;
    }

    public void setUser(String user) {
        this.user = user;
        notifyPropertyChanged(com.example.myuser.lala.BR.user);
    }

    public void setPw(String pw) {
        this.pw = pw;
        notifyPropertyChanged(com.example.myuser.lala.BR.pw);
    }
}

我的XML布局:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data class="LoginData">
        <variable
            name="logindata"
            type="com.example.myname.lala.User" />
    </data>
<RelativeLayout
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

     <TextView
        android:text="@string/user_name"
        android:id="@+id/textView"
        style="@style/textview_user" />

    <EditText
        android:hint="@string/enter_name"
        android:id="@+id/editText2"
        android:text="@{logindata.user}"
        style="@style/edittext_user" />

    <TextView
        android:text="@string/password"
        android:id="@+id/textView2"
        style="@style/textview_pw" />

    <EditText
        android:id="@+id/editText3"
        android:hint="@string/enter_password"
        android:text="@{logindata.pw}"
        style="@style/edittext_pw" />

    <Button
        android:text="@string/login"
        android:id="@+id/button2"
        style="@style/login_button" />
</RelativeLayout>
</layout>

我将xml-layout中的变量绑定到UI:

LoginData logindata = DataBindingUtil.bind(getView());
logindata.setLogindata(new User());

然后在输入用户名和密码后,我点击注册,我希望Data Binding通过{{1}自动更新user中的pwUser-Class }}和setUser但是当我尝试检索用户或pw时:

setPw

也许我误解了Log.e("user","" + logindata.getLogindata.getUser()); //output: user null Log.e("pw","" + logindata.getLogindata.getPw()); //ditto 的目的ViewModel ...

2 个答案:

答案 0 :(得分:0)

今天Android中的绑定是“单向”。如果您需要EditText的值,请使用观察者。

添加app:addTextChangedListener属性

        <EditText
            ....
            android:text="@{viewModel.loginText}"
            app:addTextChangedListener="@{viewModel.loginWatcher}" />

和观察者的相应吸气剂:

public TextWatcher getLoginWatcher() {
    return new SimpleTextWatcher() {
        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            loginText = charSequence.toString();
        }
    };
}

答案 1 :(得分:0)

您需要实现双向DataBinding以便从视图/控件中获取值。在=之后简单提供@符号以实现双向绑定

android:text="@={logindata.user}"