MVVM中是否允许操作?Android的

Art*_*kov 2 java user-interface android action mvvm

如果MVVM完全是关于数据绑定而不能做类似的事情view.doThis(),否则它是MVP,那么如何调用视图上的动作?

假设我有一个视图snackbar.View由它控制ViewModel.如果不去,这ViewModel应该如何显示?snackbarsnackbar.show()

Man*_*ari 7

在MVVM中,ViewModel捕获视图的状态.View会观察ViewModel以进行更改并自行更新.因此,View和ViewModel之间的通信是通过更改值来实现的(与MVP中的方法调用相反).

由于Snackbar它类似于全局行为(如Toast),因此可以在Activity/Fragment级别实现.因此,您可以创建一个MessageHelper接口并将其作为依赖项传递给ViewModel.Activity将实现它并显示Snackbar.

例:

但是,可能存在一些在活动级别无法实现的视图特定行为.对于这种情况,您可以使用databinding.Observable触发事件.例如,假设我们想要为特定视图设置动画.我们可以创建一个BindingAdapter

@BindingAdapter({"shakeTrigger"})
public static void showSnackbar(View view, Void trigger) {
    // Do the animation here. You could add meaningful argument types to control the animation
}
Run Code Online (Sandbox Code Playgroud)

在XML中,我们可以使用它

    <TextView
        bind:shakeTrigger="@{vm.shakeTrigger}"/>
Run Code Online (Sandbox Code Playgroud)

然后,在viewModel中,您可以使用Data Binding apis触发抖动.一种使用方式BaseObservable可以是:

public class ConfigurationViewModel extends BaseObservable implements ViewModel {
    @Bindable
    public final Void shakeTrigger = null;

    public void shake() {
        notifyPropertyChanged(BR.shakeTrigger);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用RxJava,则可以从中实现触发器rx.Observable.您可以签出我的库以使用RxJava和Data Binding. https://github.com/manas-chaudhari/android-mvvm