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

Art*_*tem 2 data-binding android 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())));
}
Run Code Online (Sandbox Code Playgroud)

并在xml

app:taskMinutes="@{task}"
Run Code Online (Sandbox Code Playgroud)

分钟会EditText正常显示,但不会添加到 中task.dueDate

但是如何添加适配器以将新输入从EditTextfiled添加到task.dueDate

Cod*_*meo 5

我的情况我添加了一个属性“输入”并在其上实现了反向绑定

@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);
    }
Run Code Online (Sandbox Code Playgroud)

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" />
Run Code Online (Sandbox Code Playgroud)

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

@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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

还有另一种简单的方法可以做到这一点:

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

    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);
    }
}
Run Code Online (Sandbox Code Playgroud)

@InverseMethod("toInt")意味着,toInt()将调用方法进行数据反转。

# 在 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" />
Run Code Online (Sandbox Code Playgroud)

# 在布局文件中导入Conversion类

<import type="bytes.wit.databinding.Conversion"/>
Run Code Online (Sandbox Code Playgroud)