如何实现Android应用重启后直接打开带已存数据的MainMenu
需求说明
已实现功能:在MainActivity中输入身高、体重、年龄并选择性别后,点击按钮可跳转至MainMenu展示对应数据。
待实现功能:输入数据保存并关闭应用后,再次启动应用时直接打开MainMenu并显示已保存的用户数据。
现有代码
MainActivity.java
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; private boolean heightIsValid() { if (enterHeight.getText().toString().length() == 0) { enterHeight.setError("Cant be empty"); return false; } double height = Double.valueOf(enterHeight.getText().toString()); if (height <= 0) { enterHeight.setError("Cant be zero"); return false; } if (height <= 40 || height > 250) { enterHeight.setError("Cant be less than 40 cm or more than 250 cm"); return false; } return true; } private boolean weightIsValid() { if (enterWeight.getText().toString().length() == 0) { enterWeight.setError("Cant be empty"); return false; } double weight = Double.valueOf(enterWeight.getText().toString()); if (weight <= 0) { enterWeight.setError("Cant be zero"); return false; } if (weight > 600) { enterWeight.setError("Cant be more than 600 kg"); return false; } return true; } private boolean ageIsValid() { if (enterAge.getText().toString().length() == 0) { enterAge.setError("Cant be empty"); return false; } double age = Double.valueOf(enterAge.getText().toString()); if (age <= 0) { enterAge.setError("Cant be zero"); return false; } if (age > 116) { enterAge.setError("Cant be older than 116 years"); return false; } return true; } private boolean genderIsSelected() { if (radioGroup.getCheckedRadioButtonId() == -1) { //checking if the user has selected a option using id Toast toast = Toast.makeText(this, "Please select gender", Toast.LENGTH_SHORT); toast.show(); return false; } if (radioMale.isChecked()) { selectedRadiobut = radioMale.getText().toString(); } else if (radioFemale.isChecked()) { selectedRadiobut = radioFemale.getText().toString(); } return true; } @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); radioMale = (RadioButton) findViewById(R.id.radioMale); radioFemale = (RadioButton) findViewById(R.id.radioFemale); button = (Button) findViewById(R.id.button); enterHeight = (EditText) findViewById(R.id.enterHeight); enterWeight = (EditText) findViewById(R.id.enterWeight); enterAge = (EditText) findViewById(R.id.enterAge); radioGroup = (RadioGroup) findViewById(R.id.radioSex); sp = getSharedPreferences("MyUserPrefs", Context.MODE_PRIVATE); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (heightIsValid() & weightIsValid() & ageIsValid() & genderIsSelected()) { height = Double.valueOf(enterHeight.getText().toString()); weight = Double.valueOf(enterWeight.getText().toString()); age = Double.valueOf(enterAge.getText().toString()); SharedPreferences.Editor editor = sp.edit(); editor.putString("height" , String.valueOf(Integer.valueOf((int) height))); editor.putString("weight" , String.valueOf(Integer.valueOf((int) weight))); editor.putString("age" , String.valueOf(Integer.valueOf((int) age))); editor.putString("gender", String.valueOf(selectedRadiobut)); editor.commit(); InputMethodManager imm = (InputMethodManager) getSystemService(getApplicationContext().INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); Intent intent = new Intent(MainActivity.this, MainMenu.class); startActivity(intent); } } }); } }
MainMenu.java
public class MainMenu extends AppCompatActivity { Button btnMC , btnFN , btnRec , btnGuides; public void btnStepClick(View view) { Intent intent = new Intent(this, StepCounter.class); startActivity(intent); } public void btnCalClick(View view) { Intent intent = new Intent(this, MacrosCalculator.class); startActivity(intent); } public void btnRecClick(View view){ Intent intent = new Intent(this, Recipes.class); startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getSupportActionBar().hide(); setContentView(R.layout.activity_main_menu); TextView age1 , height1 , weight1 , gender1; age1 = (TextView) findViewById(R.id.age1); height1 = (TextView) findViewById(R.id.height1); weight1 = (TextView) findViewById(R.id.weight1); gender1 = (TextView) findViewById(R.id.gender1); btnMC = (Button) findViewById(R.id.btnMC); btnFN = (Button) findViewById(R.id.btnFN); btnRec = (Button) findViewById(R.id.btnRec); btnGuides = (Button) findViewById(R.id.btnGuides); SharedPreferences sp = getApplicationContext().getSharedPreferences("MyUserPrefs", Context.MODE_PRIVATE); String height = sp.getString("height" , ""); String weight = sp.getString("weight" , ""); String age = sp.getString("age" , ""); String gender= sp.getString("gender", ""); gender1.setText("Gender: " + gender); age1.setText("Age: " + age); height1.setText("Height(cm): " + height); weight1.setText("Weight(kg): " + weight); } }
解决方案
核心思路
在应用启动入口(MainActivity)的初始化阶段,先检查SharedPreferences中是否存在已保存的有效用户数据。如果存在,直接跳转到MainMenu并关闭当前MainActivity;如果不存在,则正常显示输入界面。
修改步骤
- 添加启动时的数据检查逻辑
在MainActivity的onCreate方法中,初始化SharedPreferences后、初始化控件之前,加入数据判断代码:
sp = getSharedPreferences("MyUserPrefs", Context.MODE_PRIVATE); // 检查是否有已保存的有效身高数据(非空即表示数据已完整保存) String savedHeight = sp.getString("height", ""); if (!savedHeight.isEmpty()) { Intent intent = new Intent(MainActivity.this, MainMenu.class); startActivity(intent); finish(); // 关闭MainActivity,避免返回键回到输入界面 return; }
- (可选)优化数据存储类型
目前代码将数值转成String存储,可改为直接存储整数类型,提升效率和判断准确性:
- 存储逻辑修改:
// 替换原有editor.putString相关代码 editor.putInt("height", (int) height); editor.putInt("weight", (int) weight); editor.putInt("age", (int) age); editor.putString("gender", selectedRadiobut); editor.apply(); // 用apply替代commit,异步提交更高效
- MainMenu中的读取逻辑修改:
// 替换原有sp.getString相关代码 int height = sp.getInt("height", 0); int weight = sp.getInt("weight", 0); int age = sp.getInt("age", 0); String gender= sp.getString("gender", ""); gender1.setText("Gender: " + gender); age1.setText("Age: " + age); height1.setText("Height(cm): " + height); weight1.setText("Weight(kg): " + weight);
- 启动检查逻辑修改:
if (sp.getInt("height", 0) > 0) { // 跳转MainMenu的逻辑 }
修改后的完整MainActivity.java
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; private boolean heightIsValid() { if (enterHeight.getText().toString().length() == 0) { enterHeight.setError("Cant be empty"); return false; } double height = Double.valueOf(enterHeight.getText().toString()); if (height <= 0) { enterHeight.setError("Cant be zero"); return false; } if (height <= 40 || height > 250) { enterHeight.setError("Cant be less than 40 cm or more than 250 cm"); return false; } return true; } private boolean weightIsValid() { if (enterWeight.getText().toString().length() == 0) { enterWeight.setError("Cant be empty"); return false; } double weight = Double.valueOf(enterWeight.getText().toString()); if (weight <= 0) { enterWeight.setError("Cant be zero"); return false; } if (weight > 600) { enterWeight.setError("Cant be more than 600 kg"); return false; } return true; } private boolean ageIsValid() { if (enterAge.getText().toString().length() == 0) { enterAge.setError("Cant be empty"); return false; } double age = Double.valueOf(enterAge.getText().toString()); if (age <= 0) { enterAge.setError("Cant be zero"); return false; } if (age > 116) { enterAge.setError("Cant be older than 116 years"); return false; } return true; } private boolean genderIsSelected() { if (radioGroup.getCheckedRadioButtonId() == -1) { Toast toast = Toast.makeText(this, "Please select gender", Toast.LENGTH_SHORT); toast.show(); return false; } if (radioMale.isChecked()) { selectedRadiobut = radioMale.getText().toString(); } else if (radioFemale.isChecked()) { selectedRadiobut = radioFemale.getText().toString(); } return true; } @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); // 检查已保存数据,存在则直接跳转MainMenu if (sp.getInt("height", 0) > 0) { Intent intent = new Intent(MainActivity.this, MainMenu.class); startActivity(intent); finish(); return; } // 初始化控件 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); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (heightIsValid() && weightIsValid() && ageIsValid() && genderIsSelected()) { height = Double.valueOf(enterHeight.getText().toString()); weight = Double.valueOf(enterWeight.getText().toString()); age = Double.valueOf(enterAge.getText().toString()); SharedPreferences.Editor editor = sp.edit(); editor.putInt("height", (int) height); editor.putInt("weight", (int) weight); editor.putInt("age", (int) age); editor.putString("gender", selectedRadiobut); editor.apply(); InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); Intent intent = new Intent(MainActivity.this, MainMenu.class); startActivity(intent); } } }); } }
内容的提问来源于stack exchange,提问作者VGoychev
相关产品推荐
相关产品推荐

