如何使用数据绑定适配器将EditText输入添加到自定义模型?

时间:2017-03-31 11:34:34

标签: android data-binding android-databinding

这是我的数据绑定适配器:

@BindingAdapter("taskMinutes")
public static void taskMinutes(@NonNull TextView view, @NonNull Task task) {
    if (task.getDueDate() == null) {
        view.setText("");
        return;
    }
    view.setText(String.valueOf(DateUtils.getDateMinutes(task.getDueDate())));
}

xml

app:taskMinutes="@{task}"

分钟在EditText正常显示,但没有添加到task.dueDate

但是如何添加适配器以便将EditText的新输入添加到task.dueDate

3 个答案:

答案 0 :(得分:4)

我的情况是我添加了一个属性"输入"并在其上实现inverseBinding

@BindingAdapter(value = {"input", "inputAttrChanged"}, requireAll = false)
    public static void bindIntegerInText(AppCompatEditText tv, int value, final InverseBindingListener inverseBindingListener)
    {
        tv.setText(String.valueOf(value));
        // Set the cursor to the end of the text
        tv.setSelection(tv.getText().length());

        tv.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                //inverseBindingListener.onChange();
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                inverseBindingListener.onChange();
            }

            @Override
            public void afterTextChanged(Editable s) {
                //inverseBindingListener.onChange();
            }
        });
    }


    @InverseBindingAdapter(attribute = "app:input", event = "app:inputAttrChanged")
    public static int bindCountryInverseAdapter(AppCompatEditText view) {
        String string = view.getText().toString();
        return string.isEmpty() ? 0 : Integer.parseInt(string);
    }

XML:

<android.support.v7.widget.AppCompatEditText
            android:id="@+id/et_age"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginTop="16dp"
            android:ems="10"
            android:hint="Enter Age"
            android:inputType="number"
            app:input="@={userInfo.age}"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/et_password"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp" />

我在模型对象中添加一个检查,以避免模型和视图之间的无限循环

@Bindable
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        Log.d("Age","Age "+age);
        if (this.age != age){
            this.age = age;
            if (this.age != 0)
            notifyPropertyChanged(BR.age);
        }
    }

还有另一种简单的方法:

#编写一个转换类并添加这两个方法

    public class Conversion {

    @InverseMethod("toInt")
    public static String toString(int age) {
        return age == 0 ? null : String.valueOf(age);
    }

    public static int toInt(String string) {
        return string.isEmpty() ? 0 : Integer.parseInt(string);
    }
}

@InverseMethod("toInt")表示将调用toInt()方法进行数据反转。

#Insert XML

<android.support.v7.widget.AppCompatEditText
            android:id="@+id/et_age"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginTop="16dp"
            android:ems="10"
            android:hint="Enter Age"
            android:inputType="number"
            android:text="@={Conversion.toString(userInfo.age)}"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/et_password"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp" />

#导入布局文件中的Conversion类

<import type="bytes.wit.databinding.Conversion"/>

答案 1 :(得分:1)

请查看双向数据绑定。您必须定义InversBindingAdapter

答案 2 :(得分:1)

我认为您应该发现本文对于使用EditText进行转换

非常有用

https://medium.com/google-developers/android-data-binding-inverse-functions-95aab4b11873

您可以比InverseBindingAdapers更容易地执行双向转换功能。