【问题标题】:Android : Kotlin : MVVM : Why viewModel.onButtonClicked() causes the app crash?Android : Kotlin : MVVM : 为什么 viewModel.onButtonClicked() 会导致应用程序崩溃?
【发布时间】:2020-12-21 07:39:52
【问题描述】:

Logcat 消息:

java.lang.IllegalStateException:在视图类 androidx.appcompat 上定义的 android:onClick 属性的父或祖先上下文中找不到方法 @={() -> viewModel.onBtnClicked()(View)。 id 为“按钮”的 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 = "@={() -&gt; viewModel.onBtnClicked()}"
  • 错字。添加}。请删除问题

标签: android kotlin android-mvvm


【解决方案1】:

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

另一件要考虑的事情是 '=' in

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

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

【讨论】:

  • 我同意@ArMot。这是 Android 中数据绑定的一个缺点。当布局文件变得过于复杂时,很难发现这样的错误。
【解决方案2】:

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

  • 在末尾添加一个括号。
  • 您可能还想删除 @ 后面的等号

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 2021-12-27
    • 2020-05-26
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多