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

Android 如何处理对话框中的后退按钮?,android,button,dialog,back,Android,Button,Dialog,Back,我正在开发一个应用程序,当按下按钮时,它会打开一个对话框,其中包含OK和Cancel按钮 它很好用 当用户按下后退按钮时,我将按如下方式处理此问题 public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK)) { } return super.onKeyDown(keyCode, event); } 但是上面的方法没有被调用。我如何处

我正在开发一个应用程序,当按下按钮时,它会打开一个对话框,其中包含OK和Cancel按钮

它很好用

当用户按下后退按钮时,我将按如下方式处理此问题

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

    }
 return super.onKeyDown(keyCode, event);
}
但是上面的方法没有被调用。我如何处理这个问题?

试试这个

 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;


                        }
                    })

这是因为当您的对话框打开时,您的窗口将其焦点定位到对话框。
所以现在您必须在对话框中处理

您需要重写
OnCancel
方法。此方法在按Back键时调用。这里的代码对我来说是完美的

 AlertDialog alertDialog;

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

                    dialog.dismiss();                           

            }
}); 
希望这对你有帮助,如果对你有帮助,就接受它


谢谢。

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

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

如果您使用的是DialogFragment,我可以告诉您

我注意到,
setOnCancelListener
不起作用,
setOnKeyListener
起作用,但对我来说,有一个有趣的副作用,就是如果对话框有编辑文本,它会吞噬所有键。

此代码起作用:

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

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

public class MyDialog extends Dialog {

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

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


是否希望用户能够取消该对话框?或者你的onKeyDown部分是做什么的?@kiran::你能再清楚一点吗?为什么我不能在生成器中使用setOnCancelListener?没有必要关闭
对话框
<代码>完成()。此外,此方法可能会返回
false
,以便能够捕获其他关键事件,我认为下面的alexc答案是更好的选择。我在答案中添加了
和&event.getAction()==KeyEvent.ACTION\u UP
。如果没有它,代码块将执行两次。(向下键和向上键)。在本例中,它并不重要,但对于除finish()之外的其他操作,它可能非常重要。@dmmh如果不调用
dialog.disease()
将导致内存泄漏。我确信您是对的,但在这种情况下,应该在上述代码中切换
finish()
dialog.disease()
。虽然正确,关于如何在对话框中处理
,这个答案的信息量不大。这绝对是最好的答案。又好又简单。无需检测KeyEvent。太好了。我知道我来晚了,但我想指出点什么。此外,当用户单击对话框外的某个位置时,也会触发此操作。因此,如果您只需要覆盖back press选项,则这不是您要查找的。@user2520215如果您不希望在用户单击对话框外部时触发它,则应将dialog.SetCanceledOnTouchOut设置为(false)。这绝对是更好的答案。谢谢你指出。这无疑是一种更好的方法。如果在关键侦听器工作的情况下使用自定义视图(即不创建对话框,而只是从DialogFragment中继承),那么这似乎不起作用。
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();