Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ViewModel并单击侦听器_Android_Mvvm_Onclick_Onclicklistener_Android Viewmodel - Fatal编程技术网

Android ViewModel并单击侦听器

Android ViewModel并单击侦听器,android,mvvm,onclick,onclicklistener,android-viewmodel,Android,Mvvm,Onclick,Onclicklistener,Android Viewmodel,从MVP到viewModels,我觉得在放置代码时有点不知所措。 一个示例是放置单击侦听器的位置。在MVP中,我会这样做 myButton.setOnClickListener{presenter.onMyButtonClicked} 我应该对ViewModel执行同样的操作吗?我不这么认为。因为这意味着我将viewmodel视为一个演示者 但是,另一方面,如果我在视图(活动或片段)中处理单击侦听器,视图可能不会像它应该的那样愚蠢 点击监听器应该放在哪里最合适?您必须将点击监听器放在onView

从MVP到viewModels,我觉得在放置代码时有点不知所措。 一个示例是放置单击侦听器的位置。在MVP中,我会这样做

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>