onBackPressed实现带不再显示复选框的退出弹窗异常问题
问题说明
- 需求:用户首次打开应用按返回键触发退出时,弹出带评分引导的退出确认AlertDialog;弹窗增加复选框,用户勾选后后续按返回键不再重复弹出该弹窗
- 异常现象:现有代码实现后,用户勾选复选框无法正常退出应用
问题根因
现有代码存在3个核心逻辑错误:
- 执行顺序颠倒:进入
onBackPressed方法后,先创建并执行了弹窗show()操作,才去读取SharedPreferences里的"不再提示"状态,导致哪怕已经勾选过不再提示,也会先创建弹窗 - 已勾选状态下无退出逻辑:当读取到"不再提示"状态为true时,现有代码仅执行了
mDialog.hide()隐藏弹窗,没有调用super.onBackPressed()执行退出流程,自然无法退出应用 - 重复调用弹窗显示:代码中先手动调用了一次
mDialog.show(),后续else分支又调用了一次mDialog.show(),会触发重复显示的异常
修复后代码
直接替换原有对应代码即可:
@Override public void onBackPressed() { // 优先判断是否已勾选不再提示,是则直接执行退出逻辑,不创建弹窗 if (getDialogStatus()) { super.onBackPressed(); return; } // 仅需要显示弹窗时,才执行弹窗创建流程 LayoutInflater inflater = getLayoutInflater(); View alertLayout = inflater.inflate(R.layout.dailog_review, null); AlertDialog.Builder alert = new AlertDialog.Builder(this); CheckBox mCheckBox = alertLayout.findViewById(R.id.checkBox); alert.setView(alertLayout); alert.setNeutralButton("Exit", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 点击退出前保存复选框最终选中状态 storeDialogStatus(mCheckBox.isChecked()); HomeActivity.super.onBackPressed(); } }); alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 点击评分前同步保存复选框选中状态,后续不再弹出 storeDialogStatus(mCheckBox.isChecked()); try { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + getPackageName()))); } catch (android.content.ActivityNotFoundException anfe) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + getPackageName()))); } // 如果需要点击评分后直接退出应用,取消下面这行的注释即可 // HomeActivity.super.onBackPressed(); } }); AlertDialog mDialog = alert.create(); mDialog.show(); } private void storeDialogStatus(boolean isChecked){ SharedPreferences mSharedPreferences = getSharedPreferences("CheckItem", MODE_PRIVATE); SharedPreferences.Editor mEditor = mSharedPreferences.edit(); mEditor.putBoolean("item", isChecked); mEditor.apply(); } private boolean getDialogStatus(){ SharedPreferences mSharedPreferences = getSharedPreferences("CheckItem", MODE_PRIVATE); return mSharedPreferences.getBoolean("item", false); }
额外提示
你当前引用的布局名
dailog_review存在拼写错误,正确拼写应为dialog_review,如果编译时提示找不到布局资源,请修正该拼写问题。
内容的提问来源于stack exchange,提问作者arwanapratama
相关产品推荐
相关产品推荐

