如何处理对话框中的“后退”按钮?


95

我正在开发一个应用程序,当按下按钮时,它将打开一个包含“确定”和“取消”按钮的对话框。

它工作正常。

当用户按下“后退”按钮时,我将按以下方式进行处理

public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    {

    }
 return super.onKeyDown(keyCode, event);
}

但是上面的方法没有被调用。我该如何处理?


1
您是否希望用户能够取消对话框?或您的onKeyDown部分做什么?
克鲁格2012年

@kiran ::你能再清楚一点吗?
KMI 2012年

Answers:


238
dialog.setOnKeyListener(new Dialog.OnKeyListener() {

            @Override
            public boolean onKey(DialogInterface arg0, int keyCode,
                    KeyEvent event) {
                // TODO Auto-generated method stub
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    finish();
                    dialog.dismiss();
                }
                return true;
            }
        });

8
无需解雇Dialog; finish()已经照顾好了 同样,此方法可能应该返回false以能够捕获其他地方的关键事件
slinden77

6
我认为alexc在下面的答案是更好的选择。
西蒙·佛斯伯格

23
&& event.getAction() == KeyEvent.ACTION_UP在答案中添加了。没有它,代码块将被执行两次。(向下键和向上键)。在此示例中,它不是那么重要,但是对于除finish()之外的其他操作,它可能非常重要。
Udo Klimaschewski 2013年

1
@dmmh(如果您不拨打电话)dialog.dismiss()将发生内存泄漏。
CONvid19 2014年

2
我确定您是正确的,但在那种情况下finish()dialog.dismiss()应该在上面的代码中进行切换。
slinden77 2014年

115

听起来好像您想在创建对话框时设置OnCancelListener。看起来像这样:

dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {         
    @Override
    public void onCancel(DialogInterface dialog) {
        //do whatever you want the back key to do
    }
});

7
这绝对是最好的答案。漂亮又简单。无需检测KeyEvent。完善。
LargeGlasses 2015年

2
我知道我来不及,但想指出点什么。当用户单击对话框外的某个位置时,也会触发此操作。因此,如果您只需要覆盖后按选项,那么这不是您想要的。
user2520215 2015年

5
@ user2520215如果您不希望用户在对话框外单击时触发它,则应设置dialog.setCanceledOnTouchOutside(false)。这绝对是更好的答案。
Alhassan Abdulkadir

感谢您指出。那么,这无疑是一个更好的方法。
user2520215 2015年

3
在这种情况下,如果使用自定义视图(即不创建对话框,而只是从DialogFragment继承),这似乎不起作用。
朱利安·本马

19

您需要重写OnCancel方法。此方法调用后退按键。这是最适合我的代码。

 AlertDialog alertDialog;

    alertDialog.setOnCancelListener(new OnCancelListener() 
    {                   
           @Override
            public void onCancel(DialogInterface dialog) 
             {
               // TODO Auto-generated method stub

                    dialog.dismiss();                           

            }
}); 

希望这会对您有所帮助,并接受它(如果对您有帮助)。

谢谢..


7

试试这个

 new AlertDialog.Builder(this).setOnKeyListener(new DialogInterface.OnKeyListener() {

                        @Override
                        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {

                            if(keyCode == KeyEvent.KEYCODE_BACK){
                                Logger.d(TAG, "--------- Do Something -----------");
                                return true;
                            }
                            return false;


                        }
                    })

1
为什么不能在Builder中使用setOnCancelListener?
ffleandro



1

onBackPressed()在您自己的对话框中覆盖方法,并在您的代码中使用它:

public class MyDialog extends Dialog {

    public MyDialog(@NonNull Context context) {
        super(context);
    }

    @Override
    public void onBackPressed() {
        // Do what you want
    }
}

用:

MyDialog dlg = new MyDialog(context);
dlg.show();

0

此代码有效:

    Dialog dlg = new Dialog(thisAct, R.style.DialogTheme);
    dlg.setContentView(view);
    dlg.setCancelable(false);
    dlg.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
    dlg.setOnKeyListener((arg0, keyCode, event) -> {
        Timber.d("onKey(%d)", keyCode);
        //{home intercepting
        if ((keyCode == KeyEvent.KEYCODE_HOME)) {
            Timber.i("HOME pressed");
            return true;
        }

        return true;
    });
    dlg.show();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.