【问题标题】:How to handle Back button with in the dialog?如何在对话框中处理后退按钮?
【发布时间】:2012-05-07 22:17:44
【问题描述】:

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

效果很好。

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

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

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

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

【问题讨论】:

  • 您希望用户能够取消对话吗?或者你的 onKeyDown 部分是做什么的?
  • @kiran::你能再清楚一点吗??

标签: android button dialog back


【解决方案1】:
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;
            }
        });

【讨论】:

  • 没有必要关闭Dialog; finish() 已经解决了这个问题。此外,此方法可能应该返回 false 以便能够在其他地方捕获关键事件
  • 我认为下面alexc的回答是一个更好的选择。
  • 我在答案中添加了&& event.getAction() == KeyEvent.ACTION_UP。没有它,代码块将被执行两次。 (向下键和向上键)。在这个例子中它不是那么重要,但是对于finish()以外的其他操作,它可能非常重要。
  • @dmmh 如果你不调用dialog.dismiss() 会发生内存泄漏。
  • 我相信你是对的,但在这种情况下,finish()dialog.dismiss() 应该在上面的代码中切换。
【解决方案2】:

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

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

【讨论】:

  • 这绝对是最好的答案。很好很简单。无需检测 KeyEvent。完美。
  • 我知道我来晚了,但我想指出点什么。当用户点击对话框外的某处时,这也将被触发。因此,如果您只需要覆盖后按选项,那么这不是您要寻找的。​​span>
  • @user2520215 如果您不希望它在用户单击对话框外时触发,则应设置 dialog.setCanceledOnTouchOutside(false)。这绝对是更好的答案。
  • 感谢您的指出。那么这肯定是一种更好的方法。
  • 如果使用自定义视图(即不创建对话框,而只是从 DialogFragment 继承),这似乎不起作用,而关键侦听器在这种情况下工作。
【解决方案3】:

您需要覆盖OnCancel 方法。此方法在后退键按下时调用。这是对我来说完美的代码。

 AlertDialog alertDialog;

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

                    dialog.dismiss();                           

            }
}); 

希望对你有帮助,如果对你有帮助,请采纳。

谢谢..

【讨论】:

    【解决方案4】:

    试试这个

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

    【讨论】:

    • 为什么我不能在 Builder 中使用 setOnCancelListener?
    【解决方案5】:

    如果您使用的是 DialogFragment,据我所知the right way to do it is to override onCancel()

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

    【讨论】:

      【解决方案6】:

      这是因为当您的对话框打开时,您的窗口会将其焦点导航到对话框。 所以现在你必须在你的对话框上处理key

      【讨论】:

      • 虽然正确,但这个答案对于如何在对话框中处理key 提供的信息并不多。
      【解决方案7】:

      在您自己的对话框中覆盖方法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();
      

      【讨论】:

        【解决方案8】:

        此代码有效:

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

        【讨论】:

          【解决方案9】:

          对于 Kotlin:

          我试过了,对我来说效果很好。

          dialog.setOnKeyListener { _, keyCode, _ ->
                  if (keyCode == KeyEvent.KEYCODE_BACK) {
                      //do to task here
                  }
                  true
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-24
            • 1970-01-01
            相关资源
            最近更新 更多