编辑文本的双向绑定 Android
Two-way binding Android on edit text
我想为编辑文本设置双向绑定。但是到目前为止出现错误。
无法在视图类型 'android.widget.EditText' 上找到事件 'textChangeAttrChanged'
这是一个非常简单的场景,但从未见过一个好的工作示例。
部分绑定适配器:
@BindingAdapter("textChange")
@JvmStatic fun setText(view: EditText, value: String) {
if (view.text.toString() != value) {
view.setText(value)
}
}
@BindingAdapter("textChangeAttrChanged")
@JvmStatic fun setTextListener(view: EditText, onTextChange: ITextChange) {
val textWatcher : TextWatcher = object : TextWatcher {
override fun afterTextChanged(s: Editable) {
onTextChange.onTextChanged(view.text.toString())
}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
}
view.addTextChangedListener(textWatcher)
}
@InverseBindingAdapter(attribute = "textChange")
@JvmStatic fun getText(editText: EditText): String {
return editText.text.toString()
}
来自 XML:
<EditText
android:id="@+id/et_title_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/input_address"
android:inputType="textPersonName"
android:textColorHint="@color/colorGray"
textChange="@={viewModel.searchKeyword}"
textChangeAttrChanged="@{(text) -> viewModel.onSearchEntered(text)" // adding or removing this line doesn't give a thing
tools:ignore="Autofill" />
这不是为视图模型使用反向数据绑定的正确方法。
首先,EditText
已经通过数据绑定库支持双向数据绑定,因此您不必自己执行此操作。
其次,如果您想为数据绑定设置自定义视图,则只需要反向绑定适配器。在您的情况下,您只需要一个已经为数据绑定设置的现有视图来更新您的视图 moodel。
通过使用 "@={viewModel.searchKeyword}"
表示法,您表示您有一个名为 "searchKeyword" 的 属性,它同时具有 getter 和 setter,并且您希望数据绑定库在视图更改时使用视图中的值调用 setter。
因此,您需要做的就是在 属性 setter 中实现您的逻辑。像这样:
@Bindable var searchKeyord : String? = null
set(value) {
if (field != value) {
field = value
onSearchEntered(value)
notifyPropertyChanged(BR.searchKeyword)
}
}
请查看数据绑定文档以获取更多信息。
希望对您有所帮助!
我想为编辑文本设置双向绑定。但是到目前为止出现错误。
无法在视图类型 'android.widget.EditText' 上找到事件 'textChangeAttrChanged'
这是一个非常简单的场景,但从未见过一个好的工作示例。
部分绑定适配器:
@BindingAdapter("textChange")
@JvmStatic fun setText(view: EditText, value: String) {
if (view.text.toString() != value) {
view.setText(value)
}
}
@BindingAdapter("textChangeAttrChanged")
@JvmStatic fun setTextListener(view: EditText, onTextChange: ITextChange) {
val textWatcher : TextWatcher = object : TextWatcher {
override fun afterTextChanged(s: Editable) {
onTextChange.onTextChanged(view.text.toString())
}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
}
view.addTextChangedListener(textWatcher)
}
@InverseBindingAdapter(attribute = "textChange")
@JvmStatic fun getText(editText: EditText): String {
return editText.text.toString()
}
来自 XML:
<EditText
android:id="@+id/et_title_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/input_address"
android:inputType="textPersonName"
android:textColorHint="@color/colorGray"
textChange="@={viewModel.searchKeyword}"
textChangeAttrChanged="@{(text) -> viewModel.onSearchEntered(text)" // adding or removing this line doesn't give a thing
tools:ignore="Autofill" />
这不是为视图模型使用反向数据绑定的正确方法。
首先,EditText
已经通过数据绑定库支持双向数据绑定,因此您不必自己执行此操作。
其次,如果您想为数据绑定设置自定义视图,则只需要反向绑定适配器。在您的情况下,您只需要一个已经为数据绑定设置的现有视图来更新您的视图 moodel。
通过使用 "@={viewModel.searchKeyword}"
表示法,您表示您有一个名为 "searchKeyword" 的 属性,它同时具有 getter 和 setter,并且您希望数据绑定库在视图更改时使用视图中的值调用 setter。
因此,您需要做的就是在 属性 setter 中实现您的逻辑。像这样:
@Bindable var searchKeyord : String? = null
set(value) {
if (field != value) {
field = value
onSearchEntered(value)
notifyPropertyChanged(BR.searchKeyword)
}
}
请查看数据绑定文档以获取更多信息。
希望对您有所帮助!