当我在android中使用Data Binding API
时,我想删除像findViewById
这样的样板代码。
但是我有一个简单的login_fragment,它需要user-name
和user-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
中的pw
和User-Class
}}和setUser
但是当我尝试检索用户或pw时:
setPw
也许我误解了Log.e("user","" + logindata.getLogindata.getUser()); //output: user null
Log.e("pw","" + logindata.getLogindata.getPw()); //ditto
的目的ViewModel
...
答案 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}"