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

kir*_*ran 91 android dialog button back

我正在开发一个应用程序,当按下按钮时,它会打开一个带有确定和取消按钮的对话框.

它工作正常.

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

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

    }
 return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)

但是没有调用上面的方法.我怎么处理这个?

Yas*_*ien 229

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;
            }
        });
Run Code Online (Sandbox Code Playgroud)

  • 我将`&& event.getAction()== KeyEvent.ACTION_UP`添加到答案中.没有它,代码块将被执行两次.(键向下键和键UP).在这个例子中它并不那么重要,但对于除finish()之外的其他动作,它可能非常重要. (17认同)
  • 没有必要忽视"对话"; `finish()`已经解决了这个问题.此外,此方法probaly应返回"false",以便能够捕获其他地方的关键事件 (7认同)
  • 我认为alexc的答案是一个更好的选择. (6认同)
  • 我确定你是对的,但在这种情况下,`finish()`和`dialog.dismiss()`应该在上面的代码中切换. (2认同)

小智 113

听起来好像你想在创建Dialog时设置OnCancelListener.它看起来像这样:

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

  • 这绝对是最好的答案.很好,很简单.无需检测KeyEvent.完善. (6认同)
  • @ user2520215如果您不希望在用户单击对话框外部时触发它,则应设置dialog.setCanceledOnTouchOutside(false).这绝对是更好的答案. (5认同)
  • 如果使用自定义视图(即不创建对话框但只是从DialogFragment继承),而在此情况下键监听器工作,则这似乎不起作用. (3认同)
  • 我知道我已经太晚了,但想到了什么.当用户单击对话框外的某个位置时,此外还会触发此操作.因此,如果您只需要覆盖背面按下选项,那么这不是您正在寻找的. (2认同)

Nev*_*uit 19

你需要覆盖OnCancel方法.此方法调用Back Key按下.这里的代码对我来说很完美.

 AlertDialog alertDialog;

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

                    dialog.dismiss();                           

            }
}); 
Run Code Online (Sandbox Code Playgroud)

希望这会对你有所帮助,如果对你有帮助就接受它.

谢谢..


Nit*_*der 6

试试这个

 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;


                        }
                    })
Run Code Online (Sandbox Code Playgroud)