Art*_*kov 2 java user-interface android action mvvm
如果MVVM完全是关于数据绑定而不能做类似的事情view.doThis(),否则它是MVP,那么如何调用视图上的动作?
假设我有一个视图snackbar.View由它控制ViewModel.如果不去,这ViewModel应该如何显示?snackbarsnackbar.show()
在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