Android : Kotlin : MVVM : 为什么 viewModel.onButtonClicked() 导致应用程序崩溃?
Android : Kotlin : MVVM : Why viewModel.onButtonClicked() causes the app crash?
Logcat 留言:
java.lang.IllegalStateException:无法在 android:onClick 属性的父或祖先上下文中找到方法 @={() -> viewModel.onBtnClicked()(View)在视图 class androidx.appcompat.widget.AppCompatButton 上定义,id 'button'
文件 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
class MainActivity : AppCompatActivity() {
重写乐趣 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
class MainViewModel : ViewModel() {
fun onBtnClicked() {
Log.d("MainViewModel", "MainViewModel")
}
}
android:onClick="@{() -> viewModel.onBtnClicked()}"
- 在末尾添加一个括号。
- 您可能还想删除@
后面的等号
Logcat 消息有些误导。
我在几个小时内遇到了同样的错误,检查了我认为是根本原因的所有其他内容。但是对于这个特定的错误,您所要做的就是关注“{}”。这是 android 中数据绑定的缺点之一。很多时候你不会在编译时得到任何错误,如果你这样做了!这不是很有帮助!
要考虑的另一件事是
中的 '='
android:onClick = "@={() -> viewModel.onBtnClicked()}"
用于双向绑定。
在这种情况下你不需要它。
你可以阅读它 here on android official docs
Logcat 留言:
java.lang.IllegalStateException:无法在 android:onClick 属性的父或祖先上下文中找到方法 @={() -> viewModel.onBtnClicked()(View)在视图 class androidx.appcompat.widget.AppCompatButton 上定义,id 'button'
文件 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
class MainActivity : AppCompatActivity() { 重写乐趣 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
class MainViewModel : ViewModel() {
fun onBtnClicked() {
Log.d("MainViewModel", "MainViewModel")
}
}
android:onClick="@{() -> viewModel.onBtnClicked()}"
- 在末尾添加一个括号。
- 您可能还想删除@ 后面的等号
Logcat 消息有些误导。 我在几个小时内遇到了同样的错误,检查了我认为是根本原因的所有其他内容。但是对于这个特定的错误,您所要做的就是关注“{}”。这是 android 中数据绑定的缺点之一。很多时候你不会在编译时得到任何错误,如果你这样做了!这不是很有帮助!
要考虑的另一件事是
中的 '='android:onClick = "@={() -> viewModel.onBtnClicked()}"
用于双向绑定。 在这种情况下你不需要它。 你可以阅读它 here on android official docs