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

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(); 
}

关键逻辑说明

  1. 移除提前调用的super.onBackPressed():这是解决对话框弹出后Activity立即关闭的核心——我们要把关闭Activity的时机交给用户的操作(点击确定)。
  2. 确定按钮触发关闭:只有当用户输入有效数据并完成保存后,才调用super.onBackPressed()来关闭当前Activity。
  3. 输入合法性检查:额外加上了空值和格式检查,避免用户输入无效内容导致崩溃,提升体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:33:59