如何汇总不同Fragment中RadioButton的选中值并计算总和
核心问题分析
你当前的Q5Fragment仅计算了自身的选中值,前4个Fragment的选中值没有任何传递逻辑,导致提交时总和只有Q5的数值(你看到的5应该是Q5选中的RadioButton的tag值)。要实现汇总,需要让前4个Fragment把选中值同步到一个共享的存储位置,再在Q5中统一计算总和。
推荐使用ViewModel方案(生命周期安全,避免屏幕旋转等场景丢失数据),以下是具体实现步骤:
步骤1:创建共享ViewModel
创建一个保存总分的ViewModel,让所有Fragment共享:
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; public class ScoreViewModel extends ViewModel { private MutableLiveData<Integer> totalScore = new MutableLiveData<>(0); // 添加分数(首次选中时调用) public void addScore(int score) { int current = totalScore.getValue() != null ? totalScore.getValue() : 0; totalScore.setValue(current + score); } // 更新分数(修改选中项时调用,替换旧分数) public void updateScore(int oldScore, int newScore) { int current = totalScore.getValue() != null ? totalScore.getValue() : 0; totalScore.setValue(current - oldScore + newScore); } // 获取当前总分 public MutableLiveData<Integer> getTotalScore() { return totalScore; } }
步骤2:前4个Fragment的代码修改(以Q1Fragment为例)
每个前4个Fragment都需要添加RadioGroup选择监听,同步选中值到ViewModel:
import androidx.lifecycle.ViewModelProvider; import android.widget.RadioGroup; import android.widget.RadioButton; // 其他必要导入省略 public class Q1Fragment extends Fragment { private RadioGroup radioGroup; private ScoreViewModel scoreViewModel; private int lastSelectedScore = 0; // 记录上次选中的分数,用于修改时更新 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_q1, container, false); radioGroup = view.findViewById(R.id.radioGroup); // 获取共享ViewModel scoreViewModel = new ViewModelProvider(requireActivity()).get(ScoreViewModel.class); // 监听RadioGroup选择变化 radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { RadioButton selectedRadio = group.findViewById(checkedId); if (selectedRadio != null) { int newScore = Integer.parseInt(selectedRadio.getTag().toString()); // 区分首次选中和修改选中的情况 if (lastSelectedScore != 0) { scoreViewModel.updateScore(lastSelectedScore, newScore); } else { scoreViewModel.addScore(newScore); } lastSelectedScore = newScore; } } }); return view; } }
注意:Q2、Q3、Q4Fragment完全照搬上述代码,仅修改布局文件和类名即可。
步骤3:Q5Fragment的代码修改
修改Q5的提交逻辑,从ViewModel获取前4个Fragment的总分,再加上自身的选中值:
import androidx.lifecycle.ViewModelProvider; // 其他必要导入省略 public class Q5Fragment extends Fragment { private RadioGroup radioGroup; private Button btnSubmit; private ScoreViewModel scoreViewModel; private int lastSelectedScore = 0; public Q5Fragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_q5, container, false); radioGroup = view.findViewById(R.id.radioGroup); btnSubmit = view.findViewById(R.id.btnSubmit); // 获取共享ViewModel scoreViewModel = new ViewModelProvider(requireActivity()).get(ScoreViewModel.class); // 监听Q5的选择变化,同步到ViewModel radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { RadioButton selectedRadio = group.findViewById(checkedId); if (selectedRadio != null) { int newScore = Integer.parseInt(selectedRadio.getTag().toString()); if (lastSelectedScore != 0) { scoreViewModel.updateScore(lastSelectedScore, newScore); } else { scoreViewModel.addScore(newScore); } lastSelectedScore = newScore; } } }); btnSubmit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 获取ViewModel中保存的总分(包含前4个+Q5的选中值) Integer total = scoreViewModel.getTotalScore().getValue(); int finalTotal = total != null ? total : 0; Intent intent = new Intent(getActivity(), ResultActivity.class); intent.putExtra("totalValue", finalTotal); startActivity(intent); } }); return view; } }
备选方案:接口回调+Activity中转
如果不想使用ViewModel,可以通过Activity作为中转层:
- 定义
OnScoreChangeListener接口,前4个Fragment选中值变化时通知Activity - 宿主Activity实现该接口,保存总分
- Q5Fragment从Activity获取总分并加上自身选中值
具体代码逻辑类似ViewModel方案,只是把数据存储从ViewModel转移到Activity中,但ViewModel方案更稳定,推荐优先使用。
内容的提问来源于stack exchange,提问作者kasim
相关产品推荐
相关产品推荐

