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

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

很好用。

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

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


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

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

107174 次浏览

Try this

 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;




}
})

it is because when your Dialog opens then your window navigate its focused to Dialog. So now you have to handle key on your Dialog.

You need to override OnCancel method. This method calls on Back Key press. Here's code which works perfect to me.

 AlertDialog alertDialog;


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


dialog.dismiss();


}
});

Hope this will help you, and accept it if it is helpful to you.

Thanks..

Sounds like you want to set the OnCancelListener when you create the Dialog. It looks like this:

dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
//do whatever you want the back key to do
}
});
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;
}
});

If you are using a DialogFragment, from what I can tell the right way to do it is to override onCancel()

I noticed setOnCancelListener does not work, and setOnKeyListener works, but for me has the fun side effect that it swallows all keys if your dialog has an edit text.

This code works:

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

Override method onBackPressed() in your own dialog and use it in your code:

public class MyDialog extends Dialog {


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


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

Use:

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

For Kotlin:

I tried this and that is working fine for me.

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