安卓ViewModel和点击监听器

9

从MVP到viewModels,我觉得在某些代码放置的位置上有点迷茫。

一个例子是点击监听器应该放在什么地方。在MVP中,我会这样做:

myButton.setOnClickListener { presenter.onMyButtonClicked }

那么在ViewModel中是否应该这样做呢?我认为不应该。因为这意味着我把viewmodel当作了presenter。

但另一方面,如果我在视图(activity或者fragment)中处理点击监听器,那么视图可能不会像它应该的那样简单呆板。

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


因为你的问题涉及架构实现,我觉得你的问题可能基于个人看法,因为这并没有一个正确的答案。个人而言,我认为在视图中处理而不是在视图模型中处理更好,但这只是我的个人看法 :) - a_local_nobody
@a_local_nobody 因为处理可能意味着需要进行一些计算或逻辑,而视图不是正确的地方。 - a fair player
确切地说,这取决于具体情况。你可以在视图中拥有点击监听器,并且将点击的实现逻辑由VM处理。使用函数结果、回调、观察数据等方式都可以实现这一点,还可以使用数据绑定和其他众多选项,但没有真正的“最佳”解决方案。 - a_local_nobody
2个回答

16

当您使用MVVM架构时,最好将OnClick监听器添加到View Model中。在MVVM架构中,通过数据绑定,您可以以多种方式处理单击事件监听器。

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



 <Button 
      onClick="@{(view)->viewModel.onMyButtonClicked(view)}"/>
在此情况下,不需要为每个元素设置ID。要实现这一点,首先必须将ViewModel注册到Activity中。在Activity的onCreate方法中,您必须按照我下面提到的方式设置内容视图。

在此情况下,不需要为每个元素设置ID。要实现这一点,首先必须将ViewModel注册到Activity中。在Activity的onCreate方法中,您必须按照我下面提到的方式设置内容视图。

ActivityMainBinding activityMainBinding = DataBindingUtils.setContentView(this,R.layout.activity_main);
activityMainBinding.viewModel = MyViewModel(application)
activityMainBinding.lifecycleOwner = this;

在您的布局文件中添加 ViewModel 变量。

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

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



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


</layout>

如果你想在Activity中进行任何更改,那么你需要使用Observable变量。你必须在Activity类中观察这个Observable变量,并根据它的值来执行相应的操作。


好的建议。如果能在何时使用这种方法更好,何时不太好的情况下添加一些细微差别和讨论,这个答案会更有益处。 - LudvigH
好的回答。即使在您的MVVM模型中没有使用数据绑定,它也可以提供一些想法。 - Olkunmustafa

0

由于目前的表述不够清晰,建议您进行[编辑]以增加更多细节,帮助他人理解如何解决问题。您可以在帮助中心找到更多撰写良好回答的信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接