[英]Android, how to obtain state in activity from fragment
我正在针对该应用程序采用一种活动/多片段的方法。 从图片中,您可以看到一个主要活动,其中包含带有排序首选项的工具栏微调器。 用户选择的选项将决定recyclerView如何对其自身进行排序。
我的问题是,在保持关注点分离的情况下,片段获取有关用户在工具栏微调器中选择的内容的信息的最佳方法是什么?
这是活动如何在微调器中通知用户事件:
@Override
public void onSortMenuItemClicked(MenuItem id) {
mFragmentScreenNavigator.swapToJobRequestFragment(mUserProfilePersistence.getUserProfile().getEmail());
}
一旦用户选择了排序首选项,我就会有一个导航器,导航到recyclerView片段
基本上,我要实现的不是代替“告诉”片段什么是排序首选项,片段是否有办法“走出去”并获取信息? 谢谢
您可以将ViewModel
用于Activity和Fragment之间的通信。 为了使它起作用,您还可以使用LiveData
观察变量的更改并在发生更改时进行更新。
1)不要忘记添加相应的依赖项。
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
2)创建一个从ViewModel
扩展的类。 在此类中,我们具有MutableLiveData
对象,该对象最多可与LiveData
一起LiveData
。 最好使用Integer
类型,以便您可以像id一样更改它。
public class ExampleViewModel extends ViewModel {
private MutableLiveData<String> sortingMode = new MutableLiveData<>();
public LiveData<String> getSortingMode() {
return sortingMode;
}
public void setSortingMode(String mode) {
sortingMode.postValue(mode);
}
}
2)在Activity中获取对ViewModel
的引用,以便您可以从(我相信)您的选项菜单中使用排序模式更新值
ExampleViewModel viewModel = ViewModelProviders.of(this).get(ExampleViewModel.class);
3)要更改值,您只需要调用ViewModel
方法即可,该方法将根据项/ id /标题(对您而言听起来更好)来更新变量o的值。
viewModel.setSortingMode("Example Mode");
4)获取Fragment内的Activity ViewModel
ExampleViewModel viewModel = ViewModelProviders.of(getActivity()).get(ExampleViewModel.class);
5)订阅LiveData
对象以观察值变化
viewModel.getSortingMode().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
// Provide needed logic depending on sorting preferences
}
});
这只是它如何工作的一个小例子。 架构组件确实功能强大,因此我强烈建议您阅读它。
结果(绿色扇区是Activity内的Fragment,它们都在观察): 链接
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.