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

Android应用跳转第四Activity崩溃求助及优化方案咨询

问题分析与优化方案

首先咱们先明确崩溃的直接原因:你最后一个Activity的布局文件activity_last.xml里完全没有定义任何RadioGroup或RadioButton,所以当你调用findViewById(R.id.sort_b_r_g)时,返回的是null,紧接着调用null.getCheckedRadioButtonId()自然就抛出了NullPointerException,这就是应用崩溃的根源。

你用public static变量临时解决问题,虽然能跑起来,但这种做法有不少隐患:比如当应用进程被系统回收再重启时,static变量会丢失数据;而且static变量会一直占用内存,不符合Android的内存管理规范,不是长久之计。

下面给你几个更规范、更可靠的优化方案:

方案1:用Intent传递数据(最基础的跨Activity通信方式)

每个负责收集答案的Activity,在跳转到下一个Activity时,把当前收集到的答案通过Intent的putExtra方法传递过去,最后一个Activity从Intent中取出所有数据进行计算。

举个简单的例子:

  • 在第二个Activity收集完性别答案后:
Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);
// 假设选中的性别是字符串"male"或"female"
intent.putExtra("sex", selectedSex);
startActivity(intent);
  • 后续每个Activity都按这个方式传递自己收集的答案,最后在LastActivity中取出所有数据:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_last);
    
    // 从Intent中取出所有之前传递的答案
    String sex = getIntent().getStringExtra("sex");
    String sortB = getIntent().getStringExtra("sort_b");
    String winter = getIntent().getStringExtra("winter");
    // ... 取出其他所有答案
    
    // 接下来执行你的计算逻辑
    calculateResult(sex, sortB, winter, ...);
}

方案2:使用ViewModel(推荐,应对配置变化更稳定)

如果你的应用需要处理屏幕旋转这类配置变化,或者希望更优雅地共享数据,可以使用Android Architecture Components中的ViewModel。它能在配置变化时保留数据,而且不需要依赖static变量。

步骤大概是:

  1. 创建一个共享的ViewModel类:
public class AnswerViewModel extends ViewModel {
    private String sex;
    private String sortB;
    private String winter;
    // ... 定义其他答案变量

    // 提供setter和getter方法
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getSex() {
        return sex;
    }
    // ... 其他getter/setter
}
  1. 在每个收集答案的Activity中获取ViewModel实例,存储答案:
// 在第二个Activity中
AnswerViewModel viewModel = new ViewModelProvider(this).get(AnswerViewModel.class);
viewModel.setSex(selectedSex);
  1. 在LastActivity中获取同一个ViewModel实例,取出所有答案计算:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_last);
    
    AnswerViewModel viewModel = new ViewModelProvider(this).get(AnswerViewModel.class);
    String sex = viewModel.getSex();
    String sortB = viewModel.getSortB();
    // ... 取出其他答案
    
    calculateResult(sex, sortB, ...);
}

方案3:使用SharedPreferences(适合需要持久化的场景)

如果你的答案需要在用户退出应用后仍然保留,可以用SharedPreferences来存储每个答案,最后在LastActivity中读取所有数据计算。

示例代码:

  • 在收集答案的Activity中存储:
SharedPreferences sp = getSharedPreferences("AnswerPrefs", MODE_PRIVATE);
sp.edit().putString("sex", selectedSex).apply();
  • 在LastActivity中读取:
SharedPreferences sp = getSharedPreferences("AnswerPrefs", MODE_PRIVATE);
String sex = sp.getString("sex", "");
// ... 读取其他答案

最后还要提醒你:LastActivity的职责应该是计算并展示结果,不应该再去查找RadioGroup这类收集答案的控件,答案应该由前面的Activity收集好再传递过来,这样代码职责更清晰,也能避免类似的空指针问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:16:31