Reputation: 3264
I am developing an application that when the button is pressed, it opens a dialog with OK and Cancel buttons.
It works fine.
When the user presses the back button, I am handling this as follows
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ((keyCode == KeyEvent.KEYCODE_BACK))
{
}
return super.onKeyDown(keyCode, event);
}
But the above method is not called. How can I handle this?
Upvotes: 111
Views: 112475
Reputation: 3964
those who want to both disable touch events when clicked outside of dialog and handling back button should do something like:
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)
Upvotes: 0
Reputation: 4045
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;
}
});
Upvotes: 262
Reputation: 1324
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
}
Upvotes: 1
Reputation: 11
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();
Upvotes: 1
Reputation: 916
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();
Upvotes: 0
Reputation: 19824
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.
Upvotes: 4
Reputation: 1687
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
}
});
Upvotes: 124
Reputation: 2082
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..
Upvotes: 21
Reputation: 42016
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.
Upvotes: 1
Reputation: 1086
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;
}
})
Upvotes: 9