我正在尝试将edittext 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}"
,但仍然遇到相同的错误。
有什么帮助吗?
答案 0 :(得分:1)
为什么不将two-way binding与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属性都会更新(反之亦然)。
这有望解决问题!