pyu*_*s13 6 android mvvm android-mvvm android-viewmodel
我在app中关注MMVM架构,Everything工作正常,直到我使用以下代码从ViewModel启动活动时崩溃.使用数据绑定从XML调用方法并将其view
作为参数传递,并且getApplication()
是AndroidViewModel
类中的方法.
getApplication().startActivity(new Intent(view.getContext(), MyActivity.class));
Run Code Online (Sandbox Code Playgroud)
我相信这是因为我没有使用NEW_TASK标志,因为我在Activity类之外开始活动.
现在有以下解决方案我可以想到但不确定哪一个最好基于架构观点.
1. ViewModel,其方法采用Activity
参数并从片段中调用该方法
public startMyActivity(Activity activity){
activity.startActivity(new Intent(activity, MyActivity.class));
}
Run Code Online (Sandbox Code Playgroud)
现在在片段中添加类似这样的列表器
mBinding.myButton.setOnClickListener(){
viewModel.startMyActivity(getActivity());
}
Run Code Online (Sandbox Code Playgroud)
2.向intent添加一个New Task标志并将其保存在ViewModel本身中
Intent myIntent = new Intent(view.getContext(), MyActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
getApplication().startActivity(myIntent);
Run Code Online (Sandbox Code Playgroud)
3.从片段本身启动Activity
mBinding.myButton.setOnClickListener(){
activity.startActivity(new Intent(activity, MyActivity.class));
}
Run Code Online (Sandbox Code Playgroud)
我相信所有这些方法都很好,但是一个问题
是否可以在Fragment中分别使用绑定的ViewModel从view xml调用方法?
我不确定第二种方法,如果这仍然会在某些操作系统中崩溃应用程序.
从架构的角度和单元测试的角度来看哪一个是最好的方法?
我会去活动/片段内导航,但当然大多数情况下你想从视图模型触发导航.因此,您需要使用查看模型中的命令来通知您的视图(活动/片段)以在其他位置导航.您可以使用LiveData以及更具体的SingleLiveEvent来执行此类"命令" .
SingleLiveEvent就像任何LiveData一样,但只有当你明确地为它设置一个值时才触发一个事件,例如你从视图开始观察它时就不会收到它的值(活动/片段)
归档时间: |
|
查看次数: |
3269 次 |
最近记录: |