当前位置: 首页 > 知识库问答 >
问题:

Android:Kotlin:MVVM:为什么ViewModel.onButtonClicked()会导致应用崩溃?

淳于知
2023-03-14

Logcat消息:

java.lang.IllegalStateException:在Android的父上下文或祖先上下文中找不到方法@={()->ViewModel.OnBtnClicked()(View):在id为“button”的视图类AndroidX.AppCompat.Widget.AppCompatButton上定义的OnClick属性

文件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(){override 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
}

}

fun onBtnClicked() {
    Log.d("MainViewModel", "MainViewModel")
}

}

共有1个答案

卫招
2023-03-14

Logcat的信息具有一定的误导性。我面对同样的错误几个小时,检查其他一切,我认为这是根本原因。但是对于这个特定的错误,您所要做的就是关注“{}”。这是Android中数据绑定的弊端之一。很多时候你没有得到任何错误的编译时间,如果你有!那可没什么用!

另一个需要考虑的是

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

用于双向绑定。在这种情况下你不需要它。您可以在android官方文档中阅读

 类似资料:
  • 问题内容: 好吧,我试图理解并阅读可能导致它的原因,但我却无法理解: 我的代码中有这个地方: 事实是,当它尝试调用某些方法时,它将引发而不是其他预期的异常(特别是)抛出 。我实际上知道调用了什么方法,所以我直接转到该方法代码,并为应该抛出的行添加了一个块 ,它实际上按预期抛出。然而,当它上升时,以某种方式更改了上面的代码并没有 按预期进行。 是什么原因导致这种行为的?我该如何检查? 问题答案: 通

  • 我们刚刚从Visual Studio2008“升级”到Visual Studio2012。我们更新了我们的单元测试,现在它们在单独运行时通过,但是当我尝试运行全部时,我得到了以下错误: 还有人遇到过类似的问题吗?如果是的话,你是怎么解决的? 在MSDN上也问过同样的问题,但答案是“点击崩溃转储的链接”。这个答案对我没有帮助,因为我没有看到到崩溃转储的任何链接,并且我无法生成崩溃转储。 关于Stac

  • 为什么我在下面的代码段中的X轴上有一个溢出? 在我的网格容器上应用时,就会产生溢出。 null null https://codepen.io/anon/pen/wdjexz?editors=1100

  • 问题内容: 即使模型类中没有验证约束,我也会收到此错误(所有成员变量均已正确设置,但我在创建对象时仍然遇到此异常)。如何调试此错误? 问题答案: 每个都有一个数组。每个显示了您要保留的bean的哪个属性被侵犯。正如@Arthur正确指出的那样,违反Java持久性注释的结果也以s 结尾。 要调试你的问题,我会暂时赶在并打印出每个如下:

  • 这里是Android开发者新手。我在MainActivity中使用recyclerview,应用程序不断崩溃。 任何帮助都将受到赞赏! 编辑:对不起,我是新来的。我已经附加了Logcat。和其他xml文件。谢谢 这是我的代码: 列出你的布局。xml: activity_main.xml: } ProductAdapter。java类: } Logcat: 致命异常:主进程:e.wolverine2

  • 问题内容: 遇到一个错误地使用 而不是 在其代码中的人,它没有显示为编译错误。 是因为 是相同的 ? 问题答案: 没有编译错误,因为它是有效的(尽管相当无用) 一元运算符 ,其使用方式与以下方式相同: Java语言规范中的相关部分是Unary Plus运算符+(第15.15.3节) 。它指定调用一元运算会导致操作数的一元数值提升(第5.6.1节)。这意味着: * 如果操作数是编译时类型的,,,或,