0

我正在尝试在 android 应用程序上进行两种方式的数据绑定。我已设置应用程序将数据绑定到 UI,但不知道如何在 edittext 文本更改时更新数据模型。

我想创建覆盖焦点和 textchanged 的​​扩展编辑文本,以便它可以检测到文本更改和焦点以进行验证。但是我怎么知道我在处理哪个数据对象。

我尝试通过传递在 layout.xml 中返回 textwatcher 的函数来使用 app:addtextchangelistener,但我收到了 nullpointerexception。

有谁知道如何在android上进行双向数据绑定?

4

2 回答 2

0

我会添加一个自定义 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("");
            }
        });
    }
}
于 2015-12-03T19:35:16.507 回答
0

您可以在数据对象中实现 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>
于 2016-03-10T15:25:25.567 回答