Geri düğmesi iletişim kutusunda nasıl kullanılır?


96

Düğmeye basıldığında Tamam ve İptal düğmeleriyle bir iletişim kutusu açan bir uygulama geliştiriyorum.

İyi çalışıyor.

Kullanıcı geri düğmesine bastığında, bunu şu şekilde hallediyorum

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

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

Ancak yukarıdaki yöntem çağrılmaz. Bunu nasıl halledebilirim?


1
Kullanıcının iletişim kutusunu iptal edebilmesini istiyor musunuz? Veya onKeyDown bölümünüz ne işe yarar?
Krueger

@kiran :: biraz daha net olabilir misin ??
KMI

Yanıtlar:


241
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;
            }
        });

8
reddetmeye gerek yok Dialog; finish()bununla zaten ilgileniyor. Ayrıca, bu yöntem muhtemelen falsebaşka bir yerde önemli olayları yakalayabilmek için geri dönmelidir
slinden77

6
Alexc'in aşağıdaki cevabının daha iyi bir alternatif olduğunu düşünüyorum.
Simon Forsberg

23
Cevaba ekledim && event.getAction() == KeyEvent.ACTION_UP. Onsuz, kod bloğu iki kez çalıştırılacaktır. (Tuş AŞAĞI ve YUKARI tuş). Bu örnekte çok önemli değil, ancak finish () dışındaki diğer eylemler için çok önemli olabilir.
Udo Klimaschewski

1
@ dmmh aramazsanız dialog.dismiss()bellek sızıntısı olur.
Pedro Lobito

2
Eminim haklısınızdır, ancak bu durumda finish()ve dialog.dismiss()yukarıdaki kodda değiştirilmelidir.
slinden77

115

Dialog'u oluşturduğunuzda OnCancelListener'ı ayarlamak istediğiniz gibi görünüyor. Şöyle görünüyor:

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

7
Bu kesinlikle en iyi cevap. Güzel ve basit. KeyEvent'i tespit etmeye gerek yok. Mükemmel.
LargeGlasses

2
Geç kaldım biliyorum ama bir şeye işaret etmeyi düşündüm. Bu ayrıca kullanıcı iletişim kutusunun dışında bir yere tıkladığında da tetiklenecektir. Dolayısıyla, yalnızca arka baskı seçeneğini geçersiz kılmanız gerekiyorsa, aradığınız bu değildir.
user2520215

5
@ user2520215 kullanıcı iletişim kutusunun dışına tıkladığında tetiklenmesini istemiyorsanız, dialog.setCanceledOnTouchOutside (false) ayarlamalısınız. Bu kesinlikle daha iyi cevap.
Alhassan Abdulkadir

Gösterdiğiniz için teşekkürler. O zaman bu kesinlikle daha iyi bir yaklaşımdır.
user2520215

3
Bu, anahtar dinleyici bu durumda çalışırken özel bir görünüm kullanılırsa (yani diyalog oluşturmazsa, sadece DialogFragment'dan miras alınırsa) işe yaramaz.
Julian Honma

19

OnCancelYöntemi geçersiz kılmanız gerekiyor . Bu yöntem Geri Tuşuna basıldığında çağırır. İşte benim için mükemmel çalışan kod.

 AlertDialog alertDialog;

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

                    dialog.dismiss();                           

            }
}); 

Umarım bu size yardımcı olur ve size yardımcı olacaksa kabul edin.

Teşekkürler..


7

Bunu dene

 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;


                        }
                    })

1
Neden Oluşturucu'da setOnCancelListener'ı kullanamıyorum?
ffleandro


1

Bunun nedeni, Dialog'unuz açıldığında, pencerenizin odaklandığı Dialog'a gitmesidir. Yani şimdi keyDiyaloğunuzu halletmelisiniz .


Doğru olmasına rağmen, bu cevap keyDiyalogda nasıl ele alınacağı konusunda çok bilgilendirici değildir .
Simon Forsberg

1

Yöntemi onBackPressed()kendi diyaloğunuzda geçersiz kılın ve kodunuzda kullanın:

public class MyDialog extends Dialog {

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

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

Kullanım:

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

0

Bu kod çalışır:

    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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.