Android:Kotlin:MVVM:为什么viewModel.onButtonClicked导致应用程序崩溃?

问题描述

Logcat消息:

java.lang.IllegalStateException:在视图类androidx.appcompat上定义的android:onClick属性的父级或祖先上下文中找不到方法@ = {()-> viewModel.onBtnClicked()(View)。 id为“ button”的widget.AppCompatButton

文件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")
}

}

解决方法

android:onClick =“ @ {()-> viewModel.onBtnClicked()}

  • 在末尾添加括号。
  • 您也可能希望删除@
  • 之后的等号
,

Logcat消息有些令人误解。 几个小时后,我面临着相同的错误,检查了所有其他原因,我认为这是根本原因。但是对于这个特定的错误,您要做的就是留意“ {}”。这是android中数据绑定的缺点之一。很多时候,您不会在编译时遇到任何错误,而且如果这样做的话!真的没有帮助!

还有另一件事要考虑的是

中的'='
android:onClick = "@={() -> viewModel.onBtnClicked()}"

用于双向绑定。 在这种情况下,您不需要它。 您可以阅读有关here on android official docs

的信息

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...