Android: 双向数据绑定
Android: Two-way databinding
我正在尝试在 android 应用程序上进行双向数据绑定。我已将应用程序设置为将数据绑定到 UI,但不知道如何在 edittext 文本更改时更新数据模型。
我想创建扩展的 edittext 来覆盖焦点和 textchanged 以便它可以检测文本的更改和焦点以进行验证。但是我怎么知道我正在处理哪个数据对象。
我尝试使用 app:addtextchangelistener 传递函数,return 是 layout.xml 中的一个 textwatcher,但我收到了 nullpointerexception。
有谁知道如何在 android 上进行双向数据绑定?
我会添加自定义 BindingAdapter 并直接在 EditText
上设置 onFocus/textchanged 侦听器
@BindingAdapter("your_custom_attribute_name")
public static void briansSetEditTextListener(EditText editText, Boolean clear){
if (editText != null && clear) {
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View text, boolean hasFocus) {
((EditText)text).setHint("");
}
});
}
}
您可以在数据对象中实现 onTextChangeMethod
public void onTextChanged(CharSequence newText, int start, int before, int count) {
setStringField(newText.toString());
}
并添加
<EditText
...
android:onTextChanged="@{data.onTextChanged}" />
因此,每次您的文本更改时,您的数据都会更新。
此外,如果您在 UI 上显示 yourField,它应该是 ObservableField。
public class Data {
private ObservableField<String> stringField = new ObservableField<>();
public void setStringField(String changingText) {
stringField.set(changingText);
}
public ObservableField<String> getStringField() {
return stringField;
}
public void onTextChanged(CharSequence newText, int start, int before, int count) {
setStringField(newText.toString());
}
}
所有布局如下所示:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="data"
type="your.package.Data" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onTextChanged="@{data.onTextChanged}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{data.stringField}" />
</LinearLayout>
</layout>
我正在尝试在 android 应用程序上进行双向数据绑定。我已将应用程序设置为将数据绑定到 UI,但不知道如何在 edittext 文本更改时更新数据模型。
我想创建扩展的 edittext 来覆盖焦点和 textchanged 以便它可以检测文本的更改和焦点以进行验证。但是我怎么知道我正在处理哪个数据对象。
我尝试使用 app:addtextchangelistener 传递函数,return 是 layout.xml 中的一个 textwatcher,但我收到了 nullpointerexception。
有谁知道如何在 android 上进行双向数据绑定?
我会添加自定义 BindingAdapter 并直接在 EditText
上设置 onFocus/textchanged 侦听器 @BindingAdapter("your_custom_attribute_name")
public static void briansSetEditTextListener(EditText editText, Boolean clear){
if (editText != null && clear) {
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View text, boolean hasFocus) {
((EditText)text).setHint("");
}
});
}
}
您可以在数据对象中实现 onTextChangeMethod
public void onTextChanged(CharSequence newText, int start, int before, int count) {
setStringField(newText.toString());
}
并添加
<EditText
...
android:onTextChanged="@{data.onTextChanged}" />
因此,每次您的文本更改时,您的数据都会更新。 此外,如果您在 UI 上显示 yourField,它应该是 ObservableField。
public class Data {
private ObservableField<String> stringField = new ObservableField<>();
public void setStringField(String changingText) {
stringField.set(changingText);
}
public ObservableField<String> getStringField() {
return stringField;
}
public void onTextChanged(CharSequence newText, int start, int before, int count) {
setStringField(newText.toString());
}
}
所有布局如下所示:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="data"
type="your.package.Data" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onTextChanged="@{data.onTextChanged}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{data.stringField}" />
</LinearLayout>
</layout>