привязка onTextChanged для редактирования текста - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь привязать текст редактирования onTextChanged к модели представления.

это мой XML:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="viewmodel"
            type="mvvm.f4wzy.com.samplelogin.ui.login.viewmodel.LoginViewModel" />
    </data>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:inputType="text"
        android:onTextChanged="@{viewmodel.onEmailChanged}"
        android:paddingStart="5dp"
        android:textColor="#383838"
        android:textSize="20sp"/>
</layout>

LoginViewModel.kt

class LoginViewModel(application: Application) : AndroidViewModel(application) {


    fun onEmailChanged(s: CharSequence) {
        //some code

    }

}

kapt выдает ошибку при изменении текста и говорит:

[kapt] Возникла исключительная ситуация: android.databinding.tool.util.LoggedErrorException: обнаружены ошибки привязки данных.**** / ошибка привязки данных **** msg: невозможно разрешить тип для viewmodel.onEmailChanged

Я пробовал android:onTextChanged="@{(s) -> viewmodel.onEmailChanged}" и android:onTextChanged="@{viewmodel::onEmailChanged}", но все еще та же ошибка.

любая помощь?

1 Ответ

1 голос
/ 10 мая 2019

Почему бы вам просто не использовать двустороннюю привязку со свойством LiveData?

Сначала добавьте новое свойство email в вашу модель представления и подпишитесь на негополучите изменения:

class LoginViewModel(application: Application) : AndroidViewModel(application) {

    val email = MutableLiveData<String>()

    // This observer will invoke onEmailChanged() when the user updates the email
    private val emailObserver = Observer<String> { onEmailChanged(it) }

    init {
        email.observeForever(emailObserver)
    }

    override fun onCleared() {
        email.removeObserver(emailObserver)
    }

    fun onEmailChanged(newEmail: String) {
        // Some code
    }
}

Затем обновите представление, чтобы создать двустороннюю привязку между EditText и свойством email вашей модели представления:

<EditText
    ...
    android:text="@={viewModel.email}" />

Спасибочто касается двусторонней привязки, всякий раз, когда пользователь обновляет текст в представлении, ваше свойство viewmodel будет обновляться (и наоборот).

Надеемся, что это поможет!

...