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

问题描述 投票:0回答:10

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

效果很好。

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

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

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

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

android button dialog back
10个回答
262
投票
dialog.setOnKeyListener(new Dialog.OnKeyListener() {

            @Override
            public boolean onKey(DialogInterface dialog, int keyCode,
                    KeyEvent event) {                   
                if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
                    finish();
                    dialog.dismiss();
                }
                return true;
            }
        });

123
投票

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

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

21
投票

您需要重写

OnCancel
方法。此方法调用返回键按下。这是对我来说非常完美的代码。

 AlertDialog alertDialog;

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

                    dialog.dismiss();                           

            }
}); 

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

谢谢..


9
投票

试试这个

 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;


                        }
                    })

4
投票

如果您使用的是 DialogFragment,据我所知正确的方法是重写 onCancel()

我注意到

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


1
投票

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

key


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

1
投票

对于 Kotlin:

我尝试过这个,这对我来说效果很好。

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

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

0
投票

那些想要在对话框外部单击时禁用触摸事件并处理后退按钮的人应该执行以下操作:

val builder = MaterialAlertDialogBuilder(this)
            .setView(view)
            .setTitle(R.string.invalid_password_popup_title)
            .setMessage(R.string.invalid_password_popup_desc)
            .setOnCancelListener { dialog -> dialog.dismiss() }

        authErrorDialog = builder.create()
        authErrorDialog?.setCanceledOnTouchOutside(false)
© www.soinside.com 2019 - 2024. All rights reserved.