Двухстороннее связывание Android при редактировании текста - PullRequest
0 голосов
/ 27 октября 2018

Я хочу установить двустороннюю привязку для редактирования текста.Но пока получаю ошибку.

Не удалось найти событие 'textChangeAttrChanged' в типе представления 'android.widget.EditText'

Это довольно простой сценарий, но никогда не видел хороший рабочий пример.

Частьадаптеров привязки:

 @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" />

1 Ответ

0 голосов
/ 28 октября 2018

Это неправильный способ использования обратной привязки данных для модели представления.

Во-первых, EditText уже поддерживает двустороннюю привязку данных через библиотеку привязки данных, поэтому вам не нужно делать это насвое собственное.

Во-вторых, вам понадобится только адаптер обратного связывания, если вы хотите настроить собственное представление для привязки данных.В вашем случае вы просто хотите, чтобы существующее представление, которое уже настроено для привязки данных, обновляло вашу модель представления.

Используя нотацию "@={viewModel.searchKeyword}", вы указываете, что у вас есть свойство с именем "searchKeyword", котороеимеет как геттер, так и сеттер, и вы хотите, чтобы библиотека привязки данных вызывала сеттер со значением из представления при его изменении.

Таким образом, все, что вам нужно сделать, это реализовать свою логику в сеттере свойств,Примерно так:

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

Пожалуйста, просмотрите документацию по привязке данных для получения дополнительной информации.

Надеюсь, это поможет!

...