Android ViewModel 和点击监听器

a f*_*yer 5 android onclick mvvm onclicklistener android-viewmodel

从 MVP 到 viewModels,当谈到在哪里放置一些代码时,我觉得我有点迷茫。一个示例是放置点击侦听器的位置。在 MVP 我会做这样的事情

myButton.setOnClickListener { presenter.onMyButtonClicked }

我应该对 ViewModel 做同样的事情吗?我不这么认为。因为这意味着我将视图模型视为演示者。

但是,另一方面,如果我在视图(活动或片段)中处理单击侦听器,则视图可能不会像它应该的那样愚蠢。

应该处理点击监听器的最合适的地方在哪里?

小智 5

当您使用 MVVM 架构时,添加 OnClick 侦听器的最佳位置是 View Model。在 MVVM 架构中,通过数据绑定,您可以通过多种方式处理您的点击监听器。

<Button
  onClick="@{()->viewModel.onMyButtonClicked()}"/>



 <Button 
      onClick="@{(view)->viewModel.onMyButtonClicked(view)}"/>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,无需为每个都提供 Id。首先,您必须将 ViewModel 注册到您的活动中。在 Activity onCreate 中,您必须设置内容视图,如下所述。

ActivityMainBinding activityMainBinding = DataBindingUtils.setContentView(this,R.layout.activity_main);
activityMainBinding.viewModel = MyViewModel(application)
activityMainBinding.lifecycleOwner = this;
Run Code Online (Sandbox Code Playgroud)

在您的布局文件中,您必须添加 ViewModel 变量

<layout>
    <data>
        <variable
            name="viewModel"
            type=".MyViewModel" />
    </data>
    ......
    ......
   . .....

<Button
  onClick="@{()->viewModel.onMyButtonClicked()}"/>



 <Button 
      onClick="@{(view)->viewModel.onMyButtonClicked(view)}"/>


</layout>
Run Code Online (Sandbox Code Playgroud)

那么如果你想在Activity中做任何改变,那么你必须使用Observable变量。您必须在活动类中观察的可观察变量。根据您必须执行操作的值。