Android Java两个Activity间数据更新异常:返回MainActivity后数值未更新
问题分析与解决方案
核心问题
- 错误创建Activity实例:你在MainActivity的
onCreate里直接new SettingsActivity(),这完全不符合Android的Activity生命周期规则。系统会单独管理每个Activity的实例,你手动new的对象和用户实际打开的SettingsActivity根本不是同一个,所以调用getSetNrOfStimuli()拿到的永远是初始值,不会是用户修改后的数值。 - 返回后未重新初始化:从Settings返回MainActivity时,MainActivity的
onCreate不会再次执行,原来的stimuli数组不会自动更新。
具体修复步骤
1. 修改MainActivity,用Activity Result API接收返回值
首先在MainActivity里定义Activity Result Launcher,替代原来的startActivity:
// MainActivity类成员变量 private ActivityResultLauncher<Intent> settingsLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化Launcher,处理Settings返回的结果 settingsLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK) { Intent data = result.getData(); if (data != null) { // 获取返回的刺激数量 int newStimuliCount = data.getIntExtra("STIMULI_COUNT", 0); if (newStimuliCount > 0) { // 更新数值并重新初始化数组 setNrOfStimuli = newStimuliCount; stimuli = new int[setNrOfStimuli]; // 这里可以添加其他需要更新的UI或逻辑 } } } } ); // 初始化默认值(可根据需求设置,比如5) setNrOfStimuli = 5; stimuli = new int[setNrOfStimuli]; } // 修改跳转按钮的点击方法 public void onSettingBtnClicked(View view) { Intent intent = new Intent(getApplicationContext(), SettingsActivity.class); // 传递当前的刺激数量,让Settings输入框默认显示 intent.putExtra("CURRENT_COUNT", setNrOfStimuli); settingsLauncher.launch(intent); }
2. 修改SettingsActivity,返回修改后的数值
在SettingsActivity的返回按钮点击方法里,把修改后的数值通过Intent返回:
public void onBackBtnClicked(View view) { try { setNrOfStimuli = Integer.parseInt(inputNrOfStimuliView.getText().toString()); // 创建返回Intent并携带数值 Intent resultIntent = new Intent(); resultIntent.putExtra("STIMULI_COUNT", setNrOfStimuli); setResult(RESULT_OK, resultIntent); finish(); } catch (NumberFormatException e) { // 处理输入无效的情况 Toast.makeText(this, "请输入有效数字", Toast.LENGTH_SHORT).show(); } } // 在Settings的onCreate里接收Main传递的当前值,设置到输入框 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); inputNrOfStimuliView = findViewById(R.id.你的输入框ID); // 显示当前已设置的数值 int currentCount = getIntent().getIntExtra("CURRENT_COUNT", 0); if (currentCount > 0) { inputNrOfStimuliView.setText(String.valueOf(currentCount)); } }
3. 移除错误代码
删掉MainActivity里这两行不符合Android规范的代码:
settings = new SettingsActivity(); setNrOfStimuli = settings.getSetNrOfStimuli();
补充建议
如果需要重启APP后依然保留修改的数值,可以把setNrOfStimuli存在SharedPreferences里,在MainActivity的onCreate和Settings返回时分别读取、写入,实现设置持久化。
内容的提问来源于stack exchange,提问作者Tech
相关产品推荐
相关产品推荐

