Bagaimana cara menangani tombol Kembali dengan di dialog?

95

Saya mengembangkan aplikasi yang ketika tombol ditekan, itu membuka dialog dengan tombol OK dan Batal.

Ini bekerja dengan baik.

Saat pengguna menekan tombol kembali, saya menangani ini sebagai berikut

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

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

Tetapi metode di atas tidak disebut. Bagaimana saya bisa menangani ini?

kiran
sumber
1
Apakah Anda ingin pengguna dapat membatalkan dialog? Atau apa yang dilakukan bagian onKeyDown Anda?
Krueger
@kiran :: bisakah kamu lebih jelas ??
KMI

Jawaban:

238
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;
            }
        });
Yasin Hassanien
sumber
8
tidak perlu mengabaikan Dialog; finish()sudah mengurus ini. Selain itu, metode ini mungkin harus kembali falseuntuk dapat menangkap peristiwa penting di tempat lain
slinden77
6
Menurut saya jawaban alexc di bawah ini adalah alternatif yang lebih baik.
Simon Forsberg
23
Saya menambahkan && event.getAction() == KeyEvent.ACTION_UPke jawabannya. Tanpanya, blok kode akan dieksekusi dua kali. (Tombol KE BAWAH dan KE ATAS). Dalam contoh ini, ini tidak terlalu penting, tetapi untuk tindakan selain finish (), ini mungkin sangat penting.
Udo Klimaschewski
1
@dmmh jika tidak dihubungi dialog.dismiss()akan bocor memori.
CONvid19
2
Saya yakin Anda benar, tetapi dalam kasus itu finish()dan dialog.dismiss()harus diubah dalam kode di atas.
slinden77
115

Sepertinya Anda ingin menyetel OnCancelListener saat Anda membuat Dialog. Ini terlihat seperti ini:

dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {         
    @Override
    public void onCancel(DialogInterface dialog) {
        //do whatever you want the back key to do
    }
});
alexc
sumber
7
Ini pasti jawaban terbaik. Bagus dan sederhana. Tidak perlu mendeteksi KeyEvent. Sempurna.
LargeGlasses
2
Saya tahu saya terlambat, tetapi berpikir untuk menunjukkan sesuatu. Ini juga akan dipicu saat pengguna mengklik di suatu tempat di luar dialog. Jadi jika Anda hanya perlu mengganti opsi tekan kembali maka ini bukan yang Anda cari.
user2520215
5
@ user2520215 jika Anda tidak ingin memicu saat pengguna mengklik di luar dialog, Anda harus menyetel dialog.setCanceledOnTouchOutside (false). Ini pasti jawaban yang lebih baik.
Alhassan Abdulkadir
Terima kasih telah menunjukkannya. Ini tentunya merupakan pendekatan yang lebih baik.
pengguna2520215
3
Ini tampaknya tidak berfungsi jika tampilan kustom digunakan (yaitu tidak membuat dialog tetapi hanya mewarisi dari DialogFragment) sementara key listener berfungsi dalam kasus tersebut.
Julian Honma
19

Anda perlu mengganti OnCancelmetode. Metode ini membutuhkan penekanan Tombol Kembali. Inilah kode yang bekerja sempurna untuk saya.

 AlertDialog alertDialog;

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

                    dialog.dismiss();                           

            }
}); 

Semoga ini akan membantu Anda, dan menerimanya jika itu membantu Anda.

Terima kasih..

Jangan pernah Berhenti
sumber
7

Coba ini

 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;


                        }
                    })
NitZRobotKoder
sumber
1
Mengapa saya tidak dapat menggunakan setOnCancelListener di Builder?
ffleandro
1

itu karena ketika Dialog Anda terbuka, maka jendela Anda menavigasi fokusnya ke Dialog. Jadi sekarang Anda harus menangani keyDialog Anda.

Mohammed Azharuddin Shaikh
sumber
Meskipun benar, jawaban ini tidak terlalu informatif tentang bagaimana menangani keydalam Dialog.
Simon Forsberg
1

Timpa metode onBackPressed()dalam dialog Anda sendiri dan gunakan dalam kode Anda:

public class MyDialog extends Dialog {

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

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

Menggunakan:

MyDialog dlg = new MyDialog(context);
dlg.show();
santamoniya
sumber
0

Kode ini berfungsi:

    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();
Andrew Glukhoff
sumber