Android etkinliği iletişim kutusunun dış dokunuşla kapanmasını önleme


229

Başka bir etkinlik üzerinde yüzen bir pencere olduğu gibi Theme.Dialog stilini kullanan bir etkinlik var. Ancak, iletişim penceresinin dışını tıklattığımda (arka plan etkinliğinde), iletişim kutusu kapanır. Bu davranışı nasıl durdurabilirim?


1
Neden bunu yapıyorsun? İstediğiniz davranış bir iletişim kutusuysa, neden bir iletişim kutusu kullanmıyorsunuz? Sorunuza gelince, bunun bir çözümü olduğunu sanmıyorum.
Kumar Bibek

@KumarBibek diyalogları mizanpaj özelleştirmeleri söz konusu olduğunda sınırlıdır ... bu yüzden bir etkinliktir. Geliştirici dokümanlar bile esnek bir özelleştirme için bu yaklaşımı önerir
Leo

1
OP'nin istediği, Kalıcı bir iletişim kutusu, yani kullanıcıyı Tamam veya Evet / Hayır gibi yanıt vermeye zorlayan bir iletişim kutusudur . Kullanıcı sadece tıklayamamalı.
Scott Biggs

Yanıtlar:


34

Bu size yardımcı olabilir. Dış dokunma etkinliğini ele almanın bir yoludur:

Pencerenin dışına dokunduğunuzda Etkinlik gibi bir İletişim Kutusu nasıl iptal edilir?

Etkinliği yakalayıp hiçbir şey yapmadan, kapanmayı önleyebileceğinizi düşünüyorum. Ancak garip olan şey, etkinlik iletişim pencerenizin varsayılan davranışının, dışarıya dokunduğunuzda kendini kapatmak olmamasıdır .

(PS: kod WindowManager.LayoutParams kullanıyor)


1
Nesne bir iletişim kutusu değil, iletişim stilini kullanan bir Etkinlik. Etkinlik bu yönteme sahip değildir ve İletişim Kutusuna gönderilemez.
Fergusmac

Mesajınız, sorulanın tam tersidir. nasıl kapanacağını değil, kapatmayı nasıl önleyeceğini sordu.
ChuckKelly

4
"Etkinliği yakalayıp hiçbir şey yapmadan, kapanışını önleyebileceğinizi düşünüyorum" diye açıkladı.
metter

4
herhangi bir nedenle, tüm FLAG_NOT_MODAL, WATCH_OUTSIDE_TOUCH yaptıktan sonra, dış dokunuş aktiviteleri kapatmaz, ancak aktivitenin arkasındaki düğme tıklanır. bunun için bir fikrin var mı?
njzk2

Diyalogların bir gölgesi olduğunu unutmayın (en azından şimdiye kadar (8.0)): gölgeyi tıklarsanız Android bu tıklamayı diyalogun içindeymiş gibi yorumlar. Sadece bunu dünyayla paylaşmak istedim, onu almam 10 dakika sürdü.
Lorenzo Von Matterhorn

459

İletişim kutusunun basılı tuşa bırakılmasını önlemek için bunu kullanın

dialog.setCancelable(false);

İletişim kutusunun dış dokunmada kapatılmasını önlemek için bunu kullanın

 dialog.setCanceledOnTouchOutside(false);

4
Bu yanıt yardımcı olur, ancak bu soru Theme.Dialog özniteliğini kullanan etkinlikle ilgilidir.
Paresh Mayani

15
Birçok insanın silmediği için çok geç olduğunu fark ettiğimde biliyorum.
Singhak

12
Bunun gerçekten soruyla ilgili olmadığını biliyorum, ama bu bana yardımcı oldu. Teşekkürler!
dennisdrew

5
Bu en iyi cevap. Bu soruyu bulan insanların çoğunun , standardın AlertDialogdışarıdan temas etmesini önlemenin bir yolunu aradığından şüpheleniyorum ve bu cevap da bunu sağlıyor.
aroth

20
AlertDialog'un daha yeni sürümlerinde, sadece kullanmanız gerekirsetCancelable(false)
Kobi Tate

120

Gerçekte sahip olduğunuz bir Etkinliktir (bir İletişim Kutusuna benziyor olsa bile), bu nedenle setFinishOnTouchOutside(false)arka plan etkinliği tıklandığında etkinliğini korumak istiyorsanız etkinliğinizden aramalısınız .

EDIT: Bu sadece android API seviye 11 veya üstü ile çalışır


4
Bu, etkinliğinizde "geri" düğmesine basmanızı engellemez. Yani onBackPressed()vücudunda hiçbir şey yapmadan da geçersiz
kılmalısın

Bu iletişim kutusundaki "geri" düğmesini onBackPressed () olmadan Etkinliği engellemez. This.setFinishOnTouchOutside (false) ile mükemmel çalışır.
Kunalxigxag

68

Benim için işe DialogFragmentyarayan, iptal edilemeyecek bir set oluşturmaktı :

dialog.setCancelable(false);

1
Yararlı değil. Bu soru Diyaloglarla değil Etkinlikler ile ilgilidir.
Scott Biggs

20

İletişim kutusunu onCreate'de etkinlik olarak kullanırken bunu ekleyin

setFinishOnTouchOutside(false);

17

Daha yüksek API 10 için, Dialog dışarıya dokunduğunuzda kaybolur, ancak API 11'den düşük olduğunda, Diyalog kaybolmaz. Bunu önlemek için yapmanız gerekenler:

İçinde styles.xml:<item name="android:windowCloseOnTouchOutside">false</item>

VEYA

İn onCreate()yöntemi, kullanımı:this.setFinishOnTouchOutside(false);

Not: API 10 ve daha düşük sürümler için bu yöntemin bir etkisi yoktur ve gerekli değildir.


14

İletişim kutusunun yanlış olarak ayarlanabilmesi yeterlidir ve uyarı iletişim kutusunun dışına dokunduğunuzda veya geri düğmesini tıkladığınızda uyarı iletişim kutusu kaybolacaktır. Bu yüzden bunu kullanın:

setCancelable(false)

Ve diğer işlev artık gerekli değildir: dialog.setCanceledOnTouchOutside(false);

Geçici bir iletişim kutusu oluşturuyorsanız ve bu kod satırını koymayı merak ediyorsanız, işte size bir örnek:

new AlertDialog.Builder(this)
                        .setTitle("Trial Version")
                        .setCancelable(false)
                        .setMessage("You are using trial version!")
                        .setIcon(R.drawable.time_left)
                        .setPositiveButton(android.R.string.yes, null).show();

12

Benim İçin Çalıştığı Bu Kodu Kullan

 AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
 alertDialog.setCancelable(false);


eğer doğru soruyu yapabilecekse, bu doğru cevap olmalı!
alijunior

2
OP diyaloglar hakkında soruyor olsaydı, bu doğru cevap olurdu ! Ancak soru Faaliyetlerle ilgili - oldukça farklı bir durum.
Scott Biggs

11
Dialog dialog = new Dialog(context)
dialog.setCanceledOnTouchOutside(true); 
//use this to dismiss the dialog on outside click of dialog

dialog.setCanceledOnTouchOutside(false);
//use this for not to dismiss the dialog on outside click of dialog.

İletişim hakkında daha fazla bilgi için bu bağlantıyı izleyin .

dialog.setCancelable(false);
//used to prevent the dismiss of dialog on backpress of that activity

dialog.setCancelable(true);
//used to dismiss the dialog on onbackpressed of that activity

Sorunun, Dialog sınıfı DEĞİL diyalog olarak kullanılan Etkinlikler ile ilgili olduğunu lütfen unutmayın.
Scott Biggs

8

basitçe,

alertDialog.setCancelable(false);

Kullanıcının İletişim Kutusu'nun dışını tıklamasını önleyin.


7

Uyarı İletişim Kutusu kullanımdan kaldırılmıştır, bu nedenle İletişim Kutusu iletişimini kullan = yeni İletişim Kutusu (this);

Dış dokunuşta kapanmayı önlemek için

dialog.setCanceledOnTouchOutside(false);

5

setFinishOnTouchOutside(false)API> 11 için kullanın ve endişelenmeyin çünkü Android'in etkinlik temalı iletişim kutusunun varsayılan davranışı API <11 için dış dokunuşla bitmeyecek :) !! Şerefe !!


5

Ben onCreate () kullanmak, Android herhangi bir sürümü üzerinde çalışıyor gibi görünüyor; 5.0 ve 4.4.x üzerinde test edilmiştir, Gingerbread üzerinde test edilemez, Samsung cihazları (GB çalıştıran Not 1) varsayılan olarak şu şekilde bulunur:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
    {
        setFinishOnTouchOutside(false);
    }
    else
    {
        getWindow().clearFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
    }

    super.onCreate(savedInstanceState);

4
        alert.setCancelable(false);
        alert.setCanceledOnTouchOutside(false);

Sanırım bu sana yardımcı olacak.


1
Lütfen bunun neden işe yarayacağını açıklamaya çalışın ... Sadece bir kod dökümü iyi bir cevap değil.
Codebender

3

İşte benim çözümüm:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select The Difficulty Level");
builder.setCancelable(false);

2

AyrıcaCancelListener üzerinde farklı eylemler uygulamak da mümkündür:

alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){                   
    @Override
    public void onCancel(DialogInterface dialogInterface) {
        //Your custom logic
    } 
});

Uyarı iletişim kutusunun dışına dokunduğunuz için iptalin çağrılıp çağrılmadığını nasıl belirleyebilirim?
cegprakash

Bir uyarı iletişim kutusunun dışına dokunduğunuzda özel eylemler oluşturmak için çok yararlı!
Adam

1

Aynı sorunla karşı karşıyaydım. Bunu işlemek OntouchListeneriçin diyaloga a atarım ve içeride hiçbir şey yapmam. Ancak iletişim kutusu ekranı döndürürken de kapanır. Bunu düzeltmek için iletişim kutusunun normalde kapatılıp kapatılmadığını söyleyecek bir değişken ayarladım. Sonra OnDismissListeneriletişim kutusuna bir ayarladım ve içinde değişkeni kontrol ediyorum. Eğer iletişim kutusu normalde yoksaysa hiçbir şey yapmam, yoksa iletişim kutusunu tekrar çalıştırırım (ve durumumu işten çıkarırken olduğu gibi ayarlayarak).


1

builder.setCancelable (yanlış);


kamu boşluğu Mensaje (Görünüm v) {

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("¿Quieres ir a el Menú principal?");
    builder.setMessage("Al presionar SI iras a el menú y saldras de la materia.");
    builder.setPositiveButton("SI", null);
    builder.setNegativeButton("NO", null);
    builder.setCancelable(false);
    builder.show();
}

1
Merhaba Alex. StackOverflow'a hoş geldiniz ve cevabınız için teşekkür ederim. Lütfen kodunuzun ne yaptığını ve bunun OP'nin sorununu nasıl çözdüğünü açıklamak için cevabınızı düzenleyebilir misiniz? Sadece kod yanıtları, nedenini öğretmedikleri veya açıklamadıkları için önerilmez . Teşekkür ederim!
Tim Malone

-1

Bu, tüm sorularınıza mükemmel bir cevaptır .... Umarım Android'de kodlamanın tadını çıkarırsınız

new AlertDialog.Builder(this)
            .setTitle("Akshat Rastogi Is Great")
            .setCancelable(false)
            .setMessage("I am the best Android Programmer")
            .setPositiveButton("I agree", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();

                }
            })
            .create().show();

Sınırlı ve anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Düzgün bir açıklama, bunun neden problem için iyi bir çözüm olduğunu göstererek uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer sorularla gelecekteki okuyucular için daha yararlı hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin.
Maximilian Peters
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.