Android ViewModel并单击侦听器
从MVP到viewModels,我觉得在放置代码时有点不知所措。 一个示例是放置单击侦听器的位置。在MVP中,我会这样做Android ViewModel并单击侦听器,android,mvvm,onclick,onclicklistener,android-viewmodel,Android,Mvvm,Onclick,Onclicklistener,Android Viewmodel,从MVP到viewModels,我觉得在放置代码时有点不知所措。 一个示例是放置单击侦听器的位置。在MVP中,我会这样做 myButton.setOnClickListener{presenter.onMyButtonClicked} 我应该对ViewModel执行同样的操作吗?我不这么认为。因为这意味着我将viewmodel视为一个演示者 但是,另一方面,如果我在视图(活动或片段)中处理单击侦听器,视图可能不会像它应该的那样愚蠢 点击监听器应该放在哪里最合适?您必须将点击监听器放在onView
myButton.setOnClickListener{presenter.onMyButtonClicked}
我应该对ViewModel执行同样的操作吗?我不这么认为。因为这意味着我将viewmodel视为一个演示者
但是,另一方面,如果我在视图(活动或片段)中处理单击侦听器,视图可能不会像它应该的那样愚蠢
点击监听器应该放在哪里最合适?您必须将点击监听器放在
onViewCreated()
meathod中的片段类中,或者放在onCreate()
meathod中的活动类中,取决于按钮的声明位置。在使用MVVM体系结构时,添加OnClick侦听器的最佳位置是视图模型。在MVVM体系结构中,通过数据绑定,您可以以多种方式处理单击式侦听器
<Button
onClick="@{()->viewModel.onMyButtonClicked()}"/>
<Button
onClick="@{(view)->viewModel.onMyButtonClicked(view)}"/>
在布局文件中执行此操作之后,必须添加ViewModel变量
<layout>
<data>
<variable
name="viewModel"
type=".MyViewModel" />
</data>
......
......
. .....
<Button
onClick="@{()->viewModel.onMyButtonClicked()}"/>
<Button
onClick="@{(view)->viewModel.onMyButtonClicked(view)}"/>
</layout>
......
......
. .....
如果你想在活动中做任何改变,那么你必须使用可观察的变量。在活动类中必须观察的可观察变量。基于您必须执行的操作的价值。因为您的问题是关于架构的实现,我觉得您的问题可能基于观点,因为对此没有任何正确的答案,我个人不明白您为什么不在视图中而不是在viewmodel中处理此问题,但是,这是我的观点:)@a_local_没有人,因为处理可能意味着需要进行一些计算或逻辑。视图不是这样做的合适位置。确切地说,这取决于具体情况,没有理由不让视图中的单击侦听器和VM处理的单击实现逻辑:函数结果、回调、可观察数据——所有可以实现这一点的东西,您可以使用数据绑定、大量选项,没有真正最好的解决方案。建议不错。这个答案将有助于增加一些细微差别,并讨论这种方法何时好,何时不好。好答案。即使MVVM模型中没有使用数据绑定,它也能给出一个想法。
<layout>
<data>
<variable
name="viewModel"
type=".MyViewModel" />
</data>
......
......
. .....
<Button
onClick="@{()->viewModel.onMyButtonClicked()}"/>
<Button
onClick="@{(view)->viewModel.onMyButtonClicked(view)}"/>
</layout>