当我在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());然后在我输入用户名和密码后,我点击注册,我希望数据绑定通过setUser和setPw自动更新User-Class中的user和pw,但当我尝试检索用户或pw时:
Log.e("user","" + logindata.getLogindata.getUser()); //output: user null
Log.e("pw","" + logindata.getLogindata.getPw()); //ditto也许我误解了像我的User-Class这样的ViewModel的用途。
发布于 2015-09-05 02:15:32
如今,Android中的绑定是“单向的”。如果您需要EditText的值,请使用watcher。
添加app:addTextChangedListener属性
<EditText
....
android:text="@{viewModel.loginText}"
app:addTextChangedListener="@{viewModel.loginWatcher}" />以及与watcher对应的getter:
public TextWatcher getLoginWatcher() {
return new SimpleTextWatcher() {
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
loginText = charSequence.toString();
}
};
}发布于 2016-06-07 16:01:06
您需要实现双向DataBinding,以便从视图/控件中获取返回值。简单地在@之后提供=签名来实现双向绑定
android:text="@={logindata.user}"https://stackoverflow.com/questions/32397861
复制相似问题