Как обращаться с кнопкой "Назад" в диалоговом окне?

Я разрабатываю приложение, которое при нажатии кнопки открывает диалог с кнопками "ОК" и "Отмена".

Он отлично работает.

Когда пользователь нажимает кнопку "Назад", я обрабатываю это следующим образом

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

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

Но вышеупомянутый метод не вызывается. Как я могу справиться с этим?

Ответ 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;
            }
        });

Ответ 2

Похоже, вы хотите установить OnCancelListener при создании диалогового окна. Это выглядит так:

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

Ответ 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;


                        }
                    })

Ответ 5

это происходит потому, что когда открывается диалоговое окно, ваше окно перемещается в диалоговом окне. Итак, теперь вы должны обрабатывать key в диалоговом окне.

Ответ 6

Если вы используете DialogFragment, из того, что я могу сказать , правильный способ сделать это - переопределить onCancel()

Я заметил, что setOnCancelListener не работает, и setOnKeyListener работает, но у меня есть забавный побочный эффект, который он глотает все клавиши, если ваш диалог имеет текст редактирования.

Ответ 7

Этот код работает:

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

Ответ 8

Переопределите метод 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();