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
。
但是如何添加适配器以将新输入从EditText
filed添加到task.dueDate
?
我的情况我添加了一个属性“输入”并在其上实现了反向绑定
@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)
归档时间: |
|
查看次数: |
3563 次 |
最近记录: |