显示对话框从视图模型中的Android MVVM架构

问题描述:

关于MVVM新的架构组件,我有一个问题,我应该如何实施,如果我的应用程序需要与一些行动,在我的VM发生3个选项,以显示例如一个对话框?谁负责发送Activity/Fragment命令来显示对话框?显示对话框从视图模型中的Android MVVM架构

像打开新的活动或示出的对话框UI相关的动作从,而不是从一个ViewModel视图(活动或片段)触发。 ViewModel没有引用视图来防止泄漏并保持表示层“被动”。

您可以订阅您的视图模型视图(活动或片段),以可观察到的,这样,当它改变,就可以从查看启动对话或新的活动。

+1

感谢您的回答,这个解决方案是我想象的,但我不确定这是否是最好的方法。再次感谢。 –

+1

我正在做的是创建一个LiveData 我需要在我的视图中触发以调用一个新的屏幕或显示对话框的每一个动作,但我不满意这个解决方案,这在我看来并不正确。 –

+0

我们正在为此准备一个样本。我将其称为'LiveEvent',它使用'LiveData '来检查它是否已被调用。敬请关注。 –

如果对话由用户直接输入触发,说点击一个按钮,你可以使用事件参数来获取一个临时参考含活性。因此,在你的XML,如果你点击事件绑定到一个方法:

<ImageView 
    android:layout_width="24dp" 
    android:layout_height="24dp" 
    android:onClick="@{model.onClicked}" /> 

您的视图模型将有可能在它是这样的:

public void onClicked(View view) 
{ 
    MyDialogFragment.newInstance(
     (di, whichButton) -> doOkClicked(di, whichButton), 
     (di, whichButton) -> doCancelClicked(di, whichButton) 
    ).show(((Activity)view.getContext()).getFragmentManager(), "MyTag"); 
} 

public void doOkClicked(DialogInterface dialog, int whichButton) 
{ 
    ... 
} 

public void doCancelClicked(DialogInterface dialog, int whichButton) 
{ 
    ... 
} 

有些人可能会认为这违反了MVVM原则。我不认为这是一个主要问题,只要您不保留对视图参数或与其关联的上下文的引用即可。在可测试性方面,它不会比在视图(活动/片段)中具有可测性。就个人而言,我喜欢尽可能少地保留视图中的代码。

更纯粹的方法可能是创建一个管理所有导航事件的导航服务。我在WPF中用MVVM Light做了类似的事情,但是Android有很大的不同,我还没有完全探索所有我认为有很多的陷阱。

+0

在这种情况下,VM知道UI。如果我们将改变UI逻辑(例如,将Ok和Cancel按钮从对话框移动到边上的Fragment),我们需要更改VM。 –

+0

@ Danylo.Vus VM知道一个视图,不一定是任何特定的视图。这只是一个简短的参考。不幸的是,我很清楚没有这样做的好方法。 – Glaucus