Kotlin 2-сторонняя привязка пользовательский вид - PullRequest
0 голосов
/ 28 августа 2018

У меня есть 1 пользовательское представление, которое расширяет ConstraintLayout и содержит 1 EditText и 2 TextViews

В моем собственном представлении я определяю этот атрибут (и другие):

<attr name="Text" format="string" />

и я использую его как:

app:Text="@={login.email}"

Внутри моего собственного представления я определяю:

  companion object {
    @JvmStatic @BindingAdapter("Text")
    fun setText(nMe : View, nText: String) {
        nMe.nInput.setText(nText)
    }
    @InverseBindingAdapter(attribute = "Text")
    fun getText(nMe : View) : String {
      return  nMe.nInput.text.toString()
    }

Ведьма прекрасно работает в одностороннем связывании

app:Text="@{login.email}"

Но когда я пытаюсь использовать его в двухсторонней привязке, я получаю ошибки, указывающие на ActivityLoginBinding.java java.lang.String callbackArg_0 = mBindingComponent.null.getText (mEmail);

Что нужно сделать, чтобы получить двустороннюю привязку?

L.E : После некоторых исследований я получаю следующее:

@InverseBindingMethods(InverseBindingMethod(type = 
CustomInput::class,attribute = "bind:Text",event = 
"bind:textAttrChanged",method = "bind:getText"))
class CustomEditTextBinder {
companion object {
    @JvmStatic
    @BindingAdapter(value = ["textAttrChanged"])
    fun setListener(editText: CustomInput, 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 = "Text")
    fun getText(nMe: CustomInput): String {
        return nMe.nInput.text.toString()
    }

    @JvmStatic
    @BindingAdapter("Text")
    fun setText(editText: CustomInput, text: String?) {
        text?.let {
            if (it != editText.nInput.text.toString()) {
                editText.nInput.setText(it)
            }
        }
    }
}

}

Но сейчас я получаю: Не удалось найти событие TextAttrChanged

...