这是我的数据绑定适配器:
@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
?
答案 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更容易地执行双向转换功能。