如何实现Fragment间通信:OneFragment选单选按钮时ThreeFragment同步展示数据
解决方案
推荐使用Jetpack组件中的共享ViewModel实现两个Fragment的状态同步,这是官方推荐的低耦合通信方案,不需要两个Fragment互相持有引用,也能自动适配生命周期避免空指针问题,具体实现步骤如下:
1. 创建共享ViewModel类
import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; public class SharedViewModel extends ViewModel { // 存储选中的单选按钮ID,可根据业务需求替换为对应的数据实体类 private final MutableLiveData<Integer> selectedRadioId = new MutableLiveData<>(); // 对外提供更新选中状态的方法 public void setSelectedRadio(int radioId) { selectedRadioId.setValue(radioId); } // 对外提供可读的状态监听对象 public LiveData<Integer> getSelectedRadio() { return selectedRadioId; } }
2. 在OneFragment中触发状态更新
在你的单选按钮选中监听逻辑中,调用ViewModel的方法更新状态:
// 注意ViewModelProvider绑定的是宿主Activity,保证两个Fragment拿到的是同一个ViewModel实例 SharedViewModel sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class); // 你的原有单选按钮监听逻辑 yourRadioGroup.setOnCheckedChangeListener((group, checkedId) -> { // 把选中的ID同步到ViewModel sharedViewModel.setSelectedRadio(checkedId); // 保留你原来的其他业务逻辑 });
3. 在ThreeFragment中监听状态变化
在ThreeFragment的onViewCreated方法中监听状态变化,收到更新后同步自身UI和数据:
SharedViewModel sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class); // 监听选中状态变化,只有Fragment处于活跃状态时才会收到回调,避免生命周期问题 sharedViewModel.getSelectedRadio().observe(getViewLifecycleOwner(), checkedId -> { if (checkedId == null || checkedId == -1) return; // 同步选中自身的对应单选按钮 yourThreeFragRadioGroup.check(checkedId); // 加载对应的数据,替换为你自己的业务逻辑 loadRelatedData(checkedId); });
替代方案(不使用ViewModel)
如果暂时不想引入Jetpack组件,可以通过宿主Activity作为中间层实现:
- 宿主Activity定义公开的同步状态方法
- OneFragment选中单选按钮时,调用
((YourHostActivity) requireActivity()).syncRadioState(checkedId) - Activity的
syncRadioState方法中拿到ThreeFragment实例,调用其公开的更新方法即可
内容的提问来源于stack exchange,提问作者user15110327
相关产品推荐
相关产品推荐

