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

У меня есть 1 пользовательский вид, который содержит: TextView -> label; EditText -> input; TextView -> сообщение об ошибке

Я установил желаемый текст в своем тексте редактирования из своего пользовательского представления, используя пользовательский атрибут

Мой адаптер для переплета выглядит так:

@InverseBindingMethods(InverseBindingMethod(type = CustImp::class,attribute = "customtext"))
class BindingAdapters {
    companion object {
        @JvmStatic
        @BindingAdapter("customtext")
        fun settextulmeui(editText: CustImp, text: String?) {
            text?.let {
                if (it != editText.nInput.text.toString()) {
                    editText.nInput.setText(it)
                }
            }
        }

        @JvmStatic
        @BindingAdapter(value = ["customtextAttrChanged"], requireAll = false)
        fun setListener(editText: CustImp, listener: InverseBindingListener?) {
            if (listener != null) {
                editText.nInput.addTextChangedListener(object : TextWatcher {
                    override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {

                    }

                    override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {

                    }

                    override fun afterTextChanged(editable: Editable) {
                        listener.onChange()
                    }
                })
            }
        }

        @JvmStatic
        @InverseBindingAdapter(attribute = "customtext")
        fun gettextulmeui(nMe: CustImp): String {
            return nMe.nInput.text.toString()
        }
    }
}

используя в моем макете, как:

    <CustImp
        android:id="@+id/mTest"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:customtext="@={login.mytext}"
              />

Используя моё наблюдаемое поле "mytext", я могу предварительно заполнить свой текст редактирования из моего пользовательского просмотра. Я могу получить любое новое значение, которое было введено, если я нажму кнопку отправки (получите новое значение, используя мое поле наблюдения в моей модели представления)

Но: если я поверну экран, я потеряю все данные;

Любая помощь / подсказка? Спасибо

1 Ответ

0 голосов
/ 19 сентября 2018

Хотя вы говорите, что после поворота экрана все очищается, кажется, что вы просто создаете объект модели в onCreate.

model = ModelClass()

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

protected fun onCreate(savedInstanceState: Bundle) {
    ...
    model = ViewModelProviders.of(this).get(ModelClass::class.java);
    //"this" must be Activity reference
}

Но для этого ваш ModelClass должен расширять класс ViewModel и иметь пустой конструктор.

Конечно, вы можете использовать метод onSaveInstanceState для сохранения состояния моделей, но для меня ViewModel лучше.

PS Говоря "модель", я имею в виду объект с именем login в макете XML, который содержит данные для интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...