Android:重写onBackPressed时自定义对话框弹出后Activity直接关闭问题
解决返回键先弹对话框获取输入再关闭Activity的问题
嗨,我来帮你搞定这个问题!你现在遇到的核心问题是一开始就调用了super.onBackPressed()——这行代码会直接触发Activity的关闭流程,所以对话框刚弹出来,Activity就已经被关掉了,自然没法完成后续的输入操作。
下面是调整后的完整解决方案:
第一步:修改onBackPressed()方法
把默认的返回逻辑移走,先处理对话框的弹出,只有在不需要保存数据的时候才直接关闭Activity:
@Override public void onBackPressed() { // 先处理定时器取消逻辑 if(enableTimer) { countDownTimer.cancel(); } // 需要保存历史数据时,弹出对话框 if(enableHistorySaving){ showCustomDialog(vp.getCurrentItem()); } else { // 不需要保存的话,直接执行默认返回操作 super.onBackPressed(); } }
第二步:修改对话框的确定按钮逻辑
在用户完成输入并点击确定后,先保存数据,再调用super.onBackPressed()关闭Activity:
public void showCustomDialog(final int position){ final Dialog dialog = new Dialog(ExerciseActivity.this); dialog.setContentView(R.layout.enter_data); dialog.setTitle("save your data..."); Button okButton = (Button) dialog.findViewById(R.id.ok); okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 先做输入合法性检查(避免崩溃) EditText setsEditText = dialog.findViewById(R.id.numOfSetsDialog); EditText weightEditText = dialog.findViewById(R.id.wights); String setsStr = setsEditText.getText().toString().trim(); String weightStr = weightEditText.getText().toString().trim(); if(TextUtils.isEmpty(setsStr)){ Toast.makeText(ExerciseActivity.this, "请输入组数", Toast.LENGTH_SHORT).show(); return; } if(TextUtils.isEmpty(weightStr)){ Toast.makeText(ExerciseActivity.this, "请输入重量", Toast.LENGTH_SHORT).show(); return; } int numOfSets; try { numOfSets = Integer.parseInt(setsStr); } catch(NumberFormatException e){ Toast.makeText(ExerciseActivity.this, "请输入有效的组数数字", Toast.LENGTH_SHORT).show(); return; } // 保存数据 saveToExcelFile(dayExercises.get(position), weightStr, numOfSets); dialog.dismiss(); // 保存完成后,关闭Activity ExerciseActivity.super.onBackPressed(); } }); Button cencelButton = (Button) dialog.findViewById(R.id.cencel); cencelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); // 如果取消后也需要关闭Activity,就取消下面这行注释 // ExerciseActivity.super.onBackPressed(); } }); dialog.show(); }
关键逻辑说明
- 移除提前调用的
super.onBackPressed():这是解决对话框弹出后Activity立即关闭的核心——我们要把关闭Activity的时机交给用户的操作(点击确定)。 - 确定按钮触发关闭:只有当用户输入有效数据并完成保存后,才调用
super.onBackPressed()来关闭当前Activity。 - 输入合法性检查:额外加上了空值和格式检查,避免用户输入无效内容导致崩溃,提升体验。
内容的提问来源于stack exchange,提问作者keiloda
相关产品推荐
相关产品推荐

