如何解决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
的信息版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。