kiran
kiran

Reputation: 3264

How to handle Back button with in the dialog?

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

Answers (10)

kokoko
kokoko

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

Yasin Hassanien
Yasin Hassanien

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

Ghayas
Ghayas

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

santamoniya
santamoniya

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

Andrew Glukhoff
Andrew Glukhoff

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

Daniel Wilson
Daniel Wilson

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

alexc
alexc

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

Never Quit
Never Quit

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

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

NitZRobotKoder
NitZRobotKoder

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

Related Questions