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

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:测试验证

  1. 首次启动App,录入数据后跳转主菜单,确认数据展示正常
  2. 点击Edit按钮,确认跳转到MainActivity并加载已有数据
  3. 修改数据后点击Save Changes,确认数据更新并回到主菜单
  4. 再次点击Edit按钮,确认新数据正常加载,无崩溃情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:04:52