Android开发:实现编辑按钮返回MainActivity修改SharedPreferences值
问题分析与解决方案
崩溃原因
点击Edit按钮跳转回MainActivity时,由于SharedPreferences中已存在用户数据,MainActivity的onCreate方法会直接再次跳转到MainMenu,形成无限循环跳转,最终引发App崩溃;同时原逻辑下MainActivity仅在无缓存时初始化编辑控件,无法实现修改功能。
修复步骤
步骤1:修改MainActivity的跳转逻辑,添加编辑模式判断
给Intent添加标记区分首次启动和编辑模式,同时确保编辑模式下能加载已有数据并初始化控件:
public class MainActivity extends AppCompatActivity { EditText enterHeight, enterWeight, enterAge; private double height; private double weight; private double age; String selectedRadiobut; Button button; RadioButton radioMale, radioFemale; RadioGroup radioGroup; SharedPreferences sp; // 定义SharedPreferences键常量(可选,避免硬编码错误) private static final String PREF_HEIGHT = "height"; private static final String PREF_WEIGHT = "weight"; private static final String PREF_AGE = "age"; private static final String PREF_GENDER = "gender"; // 原有校验方法保持不变... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getSupportActionBar().hide(); setContentView(R.layout.activity_main); getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); sp = getSharedPreferences("MyUserPrefs", Context.MODE_PRIVATE); // 获取编辑模式标记,默认非编辑模式 boolean isEditMode = getIntent().getBooleanExtra("IS_EDIT_MODE", false); // 仅当非编辑模式且存在完整缓存时,直接跳转主菜单 if (!isEditMode && sp.contains(PREF_HEIGHT) && sp.contains(PREF_WEIGHT) && sp.contains(PREF_AGE) && sp.contains(PREF_GENDER)) { Intent intent = new Intent(MainActivity.this, MainMenu.class); startActivity(intent); // 跳转后销毁当前Activity,清理栈结构 finish(); } else { // 初始化所有控件,无论首次录入还是编辑模式 radioMale = findViewById(R.id.radioMale); radioFemale = findViewById(R.id.radioFemale); button = findViewById(R.id.button); enterHeight = findViewById(R.id.enterHeight); enterWeight = findViewById(R.id.enterWeight); enterAge = findViewById(R.id.enterAge); radioGroup = findViewById(R.id.radioSex); // 编辑模式下加载已有数据到控件 if (isEditMode) { String savedHeight = sp.getString(PREF_HEIGHT, ""); String savedWeight = sp.getString(PREF_WEIGHT, ""); String savedAge = sp.getString(PREF_AGE, ""); String savedGender = sp.getString(PREF_GENDER, ""); enterHeight.setText(savedHeight); enterWeight.setText(savedWeight); enterAge.setText(savedAge); // 设置性别单选框选中状态 if (savedGender.equals(radioMale.getText().toString())) { radioMale.setChecked(true); } else if (savedGender.equals(radioFemale.getText().toString())) { radioFemale.setChecked(true); } // 修改按钮文本为保存修改 button.setText("Save Changes"); } button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 用短路与&&替代&,提升效率 if (heightIsValid() && weightIsValid() && ageIsValid() && genderIsSelected()) { height = Double.parseDouble(enterHeight.getText().toString()); weight = Double.parseDouble(enterWeight.getText().toString()); age = Double.parseDouble(enterAge.getText().toString()); SharedPreferences.Editor editor = sp.edit(); editor.putString(PREF_HEIGHT, String.valueOf((int) height)); editor.putString(PREF_WEIGHT, String.valueOf((int) weight)); editor.putString(PREF_AGE, String.valueOf((int) age)); editor.putString(PREF_GENDER, selectedRadiobut); editor.apply(); // 用异步apply替代同步commit,更高效 InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); Intent intent = new Intent(MainActivity.this, MainMenu.class); startActivity(intent); // 销毁当前Activity,回到主菜单 finish(); } } }); } }
步骤2:修改MainMenu的Edit按钮点击事件,传递编辑模式标记
在跳转Intent中添加编辑模式参数,告诉MainActivity进入编辑状态:
public void btnEditClick(View view){ Log.d("MainMenu", "Edit button clicked"); Intent intent = new Intent(this, MainActivity.class); // 添加编辑模式标记 intent.putExtra("IS_EDIT_MODE", true); startActivity(intent); // 销毁当前MainActivity,避免栈中残留(可选,根据需求调整) finish(); }
步骤3:测试验证
- 首次启动App,录入数据后跳转主菜单,确认数据展示正常
- 点击Edit按钮,确认跳转到MainActivity并加载已有数据
- 修改数据后点击Save Changes,确认数据更新并回到主菜单
- 再次点击Edit按钮,确认新数据正常加载,无崩溃情况
内容的提问来源于stack exchange,提问作者VGoychev
相关产品推荐
相关产品推荐

