Android : Kotlin : MVVM : Why viewModel. onButtonClicked() 导致应用崩溃?

标签 android kotlin android-mvvm

Logcat 消息:
java.lang.IllegalStateException:在 View 类 androidx.appcompat.widget.AppCompatButton 上定义的 android:onClick 属性的父级或祖先上下文中找不到方法 @={() -> viewModel.onBtnClicked()(View) id '按钮'
文件 1:activity_main.xml

<data>
    <variable
        name="viewModel"
        type="com.wingsquare.databindingdemo.MainViewModel" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:onClick = "@={() -> viewModel.onBtnClicked()"
        />
</androidx.constraintlayout.widget.ConstraintLayout>

文件 2:MainActivity.kt
类 MainActivity : AppCompatActivity() {
覆盖 fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
    val binding: ActivityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main)

    // val binding = ActivityMainBinding.inflate(layoutInflater)
    val mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)
    binding.viewModel = mainViewModel
    binding.lifecycleOwner = this
}
}
文件 3:MainViewModel.kt
类 MainViewModel : ViewModel() {
fun onBtnClicked() {
    Log.d("MainViewModel", "MainViewModel")
}
}

最佳答案

Logcat 消息有些误导。
我在几个小时内都面临同样的错误,检查了我认为是根本原因的所有其他内容。但是对于这个特定的错误,您所要做的就是密切关注“{}”。这是android中数据绑定(bind)的缺点之一。很多时候你不会在编译时得到任何错误,如果你这样做了!这不是很有帮助!
另一件要考虑的事情是 '=' 在

android:onClick = "@={() -> viewModel.onBtnClicked()}"
用于双向绑定(bind)。
在这种情况下你不需要它。
你可以阅读它here on android official docs

关于Android : Kotlin : MVVM : Why viewModel. onButtonClicked() 导致应用崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63700389/

相关文章:

Android Kotlin 在 ObservableField 上除了 get() 或 getValue() 之外还需要使用什么

android - 多点触控似乎不适用于我测试过的所有 3 种设备

android - 在 Android 上使用像素缓冲对象 (PBO)

java - 如何以编程方式填充 Android Manifest 元数据值?

Android - 如果 View 模型包含 Activity 监听器引用,是否会发生内存泄漏?

android - 如果没有 @Provides 注释的方法,则无法提供 Dagger 柄

android - Kotlin Flow - 有没有类似于 LiveData 的 emitSource 的东西?

Java8 中 Optional::map 的 Kotlin 等价物

android - Kotlin:如何使用 Kotlin 在 Android 中获取和设置文本到 TextView?

android - 如果方法使用不重叠,2 个 Activity 是否应该有单独的 ViewModel?