在编辑文本上双向绑定Android

问题描述 投票:0回答:1

我想为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" />
android kotlin android-edittext android-jetpack
1个回答
1
投票

这不是对视图模型使用反向数据绑定的正确方法。

首先,EditText已经通过数据绑定库支持双向数据绑定,因此您不必自己执行此操作。

其次,如果要为数据绑定设置自定义视图,则只需要反向绑定适配器。在您的情况下,您只需要一个已经设置用于数据绑定的现有视图来更新视图模型。

通过使用"@={viewModel.searchKeyword}"表示法,您指示您有一个名为“searchKeyword”的属性,该属性同时具有getter和setter,并且您希望数据绑定库在更改时使用视图中的值调用setter。

因此,您需要做的就是在属性设置器中实现逻辑。像这样的东西:

@Bindable var searchKeyord : String? = null
    set(value) {
        if (field != value) {
            field = value
            onSearchEntered(value)
            notifyPropertyChanged(BR.searchKeyword)
        }
    }

有关详细信息,请查看数据绑定文档。

希望有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.