gpt4 book ai didi

java - Android,如何从fragment获取activity中的状态

转载 作者:行者123 更新时间:2023-12-02 09:31:35 25 4
gpt4 key购买 nike

我正在遵循此应用程序的一个 Activity/多个 fragment 方法。从图片中,您可以看到有一个主要 Activity ,带有带有排序首选项的工具栏微调器。用户选择的选项将决定 recyclerView 如何对其自身进行排序。

我的问题是, fragment 在保持关注点分离的同时获取有关用户在工具栏微调器中选择的内容的信息的最佳方法是什么?

以下是 Activity 如何获取微调器中的用户事件通知的方式:

@Override
public void onSortMenuItemClicked(MenuItem id) {
mFragmentScreenNavigator.swapToJobRequestFragment(mUserProfilePersistence.getUserProfile().getEmail());
}

一旦用户选择了排序首选项,我就有一个导航器可以导航到 recyclerView fragment

基本上,我想要实现的不是“告诉” fragment 排序首选项是什么,有没有办法让 fragment “出去”并获取该信息?谢谢

enter image description here

enter image description here

最佳答案

您可以使用ViewModel来实现Activity和Fragment之间的通信。为了使其正常工作,您还可以使用 LiveData 来观察变量更改并在发生变化时进行更新。

1)不要忘记添加相应的依赖项。

implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'

2) 创建一个从 ViewModel 扩展的类。在此类中,我们有 MutableLiveData 对象,它允许使用 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/标题(任何听起来对您更好的内容)更新变量值。

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,他们都在观察): link

关于java - Android,如何从fragment获取activity中的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57914668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com