【问题标题】:binding onTextChanged for edit text绑定 onTextChanged 以编辑文本
【发布时间】:2019-05-10 13:14:08
【问题描述】:

我正在尝试将 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:Cannot resolve type for viewmodel.onEmailChanged

我尝试了android:onTextChanged="@{(s) -&gt; viewmodel.onEmailChanged}"android:onTextChanged="@{viewmodel::onEmailChanged}",但仍然是同样的错误。

有什么帮助吗?

【问题讨论】:

  • 如果您将调用更改为以下内容是否有效:android:onTextChanged="@{(s) -&gt; viewmodel.onEmailChanged(s)}"
  • 不工作!!它甚至没有被编译。当我绑定文本时,它知道我正在编写代码,而不是字符串,但 ontextchanged XML 无法识别代码。 @JulioE.RodriguezCabañas
  • 我不明白你的意思,但我的建议是从 viewmodel.onEmailChanged 更改为 viewmodel.onEmailChanged(s) 以防万一,因为第一种方式(即你的方式)显然行不通. onEmailChanged 是一个方法,应该这样调用——你在绑定表达式中使用的代码基本上是 Java 代码。
  • 我会考虑在这里做two-way binding 而不是调用方法。

标签: android android-databinding


【解决方案1】:

为什么不直接使用 two-way bindingLiveData 属性?

首先,将新的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 属性都会更新(反之亦然)。

这应该可以解决问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    相关资源
    最近更新 更多