跨Activity传值用于IF语句失效及SharedPreferences数据加载异常解决
问题分析与解决方案
看起来你遇到的核心问题是从StartActivity传递的data1参数在MainActivity中没被正确接收,导致data1 == 1的分支无法执行。我帮你梳理几个最可能的原因和对应的修复方案:
1. 传递与接收的Key不匹配
你在StartActivity里用字符串"EXTRA_DATA"作为key传值,但在MainActivity中尝试用StartActivity.EXTRA_DATA来接收。如果你的StartActivity里没定义这个静态常量,那这个key其实是无效的,会直接返回默认值0。
修复方案:
在StartActivity中定义一个公开的静态常量作为统一key:
public static final String EXTRA_DATA = "EXTRA_DATA";
然后传值时也用这个常量:
intent.putExtra(StartActivity.EXTRA_DATA, data1);
这样两边的key完全一致,就不会出现匹配失败的情况了。
2. 获取Intent的时机不对
你代码里Intent intentTest = getIntent();的位置如果不在onCreate()方法内(或者没在Activity初始化阶段调用),可能会拿到错误的Intent实例,导致取不到传递的参数。
修复方案:
把获取Intent的代码放在MainActivity的onCreate()里,并且放在视图初始化之后、分支判断之前:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 先完成视图初始化 countLabel = findViewById(R.id.countLabel); questionLabel = findViewById(R.id.questionLabel); answerBtn1 = findViewById(R.id.answerBtn1); // ... 其他按钮初始化 // 再获取传递的参数 Intent intentTest = getIntent(); int data1 = intentTest.getIntExtra(StartActivity.EXTRA_DATA, 0); // 最后执行分支判断逻辑 if (data1 == 1) { // qDB1的处理逻辑 for (String[] quizDatum : qDB1) { ArrayList<String> tmpArray = new ArrayList<>(); tmpArray.add(quizDatum[0]); tmpArray.add(quizDatum[1]); tmpArray.add(quizDatum[2]); tmpArray.add(quizDatum[3]); tmpArray.add(quizDatum[4]); questionArray1.add(tmpArray); } showNextQuiz(); } else { // qDB2的处理逻辑 for (String[] quizDatum : qDB2) { ArrayList<String> tmpArray = new ArrayList<>(); tmpArray.add(quizDatum[0]); tmpArray.add(quizDatum[1]); tmpArray.add(quizDatum[2]); tmpArray.add(quizDatum[3]); tmpArray.add(quizDatum[4]); questionArray1.add(tmpArray); } showNextQuiz(); } }
3. 额外排查:确认Intent未被覆盖
如果MainActivity有其他启动方式(比如从其他Activity启动、Manifest中设置了特殊launchMode导致实例复用),可能会拿到错误的Intent。你可以加个日志确认接收到的数值:
int data1 = intentTest.getIntExtra(StartActivity.EXTRA_DATA, 0); Log.d("MainActivity", "接收到的data1值:" + data1);
通过日志能直观看到数值,进一步定位问题。
按上面的步骤排查,应该就能解决分支不执行的问题了。
内容的提问来源于stack exchange,提问作者K Lee
相关产品推荐
相关产品推荐

