You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何汇总不同Fragment中RadioButton的选中值并计算总和

问题解决:汇总多个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作为中转层:

  1. 定义OnScoreChangeListener接口,前4个Fragment选中值变化时通知Activity
  2. 宿主Activity实现该接口,保存总分
  3. Q5Fragment从Activity获取总分并加上自身选中值

具体代码逻辑类似ViewModel方案,只是把数据存储从ViewModel转移到Activity中,但ViewModel方案更稳定,推荐优先使用。

内容的提问来源于stack exchange,提问作者kasim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:14:53