【问题标题】:Android ViewModel and click listenersAndroid ViewModel 和点击监听器
【发布时间】:2020-07-12 17:09:33
【问题描述】:

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

myButton.setOnClickListener { presenter.onMyButtonClicked }

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

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

应该在哪里处理点击侦听器最合适的位置?

【问题讨论】:

  • 因为您的问题是关于架构的实现,我觉得您的问题可能是基于意见,因为对此没有任何正确答案,我个人不明白为什么不会在视图中而不是在视图模型中处理这个问题,但同样,这是我的 opinion :)
  • @a_local_nobody 因为处理可能意味着应该进行一些计算或逻辑。并且视图不是这样做的正确位置。
  • 没错,视情况而定,没有理由不能在视图中设置点击监听器以及VM处理点击的实现逻辑:函数结果、回调、可观察数据- 实现这一目标的所有可用方法,您可以使用数据绑定、大量选项,没有真正的最佳解决方案

标签: android mvvm onclick onclicklistener android-viewmodel


【解决方案1】:

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

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



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

在此,无需为每个人提供 ID。首先,您必须将 ViewModel 注册到您的活动中。在 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变量。您必须在活动类中观察到的可观察变量。基于您必须执行的操作的价值。

【讨论】:

  • 不错的建议。通过添加一些细微差别和讨论这种方法什么时候好,什么时候不太好,这个答案会有所帮助。
  • 好答案。即使在您的 MVVM 模型中未使用数据绑定,它也可以提供一个想法。
【解决方案2】:

根据文档,ViewModel 用于保存数据,不应保存对可能具有较短生命周期的 Context 的任何引用。 (Activity、Frag、View、Button 等)

A good codelab here

不在 codelab 中,但在 "Intro to ViewModel" Video 中,他们建议在需要时使用 Presenter 类以使 ViewModel 更简单。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
相关资源
最近更新 更多