2013-05-10 16 views
73

Bir android uygulamasında çalışıyorum ve bir iletişim kutusu göstermek için DialogFragment kullanıyorum ve bu DialogFragment'i iptal edilemez yapmak istiyorum. Ben diyalogu mülkiyeti yanlış olarak kabul ettirdim, ama hala etkilemiyor.DialogFragment setCancelable özellik çalışmıyor

Lütfen koduma bakın ve bana bir çözüm öner. Eğer iletişim kullanımı aşağıdaki kod satırı

DialogFragment.getDialog().setCanceledOnTouchOutside(true); 
+19

() setCancelable; seni setCancelable (false); – Blackbelt

+0

numaralı telefon hattını çağırmanız gerekiyorsa, iletişim kutusunun dışını tıklarsanız, aynı zamanda dezenfekte edilmeli mi? –

+0

Dondurmalı sandviçte mi çalışıyorsunuz? Lütfen bağlantıya bakın http://www.fantasypublishings.com/morePhpHelp/ice_cream_sandwich__android_40_Dialog_gets_canceled_when_touched_outside_of_dialog_window__Stack_Overflow_page93701 .php – Remmyabhavan

cevap

171
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.dialog_test, container, true); 
    getDialog().requestWindowFeature(STYLE_NO_TITLE); 
    getDialog().setCancelable(false); 

    return view; 
} 

yerine getDialog().setCancelable(false); sizi etrafında yan dokunmatik devre dışı bırakmak istiyorsanız

public class DialogTest extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     return super.onCreateDialog(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.dialog_test, container, true); 
     getDialog().requestWindowFeature(STYLE_NO_TITLE); 
     getDialog().setCancelable(false); 

     return view; 
    } 
} 
+0

Bu gerçekten inanılmaz bir ipucu, THANKS. Nedeniyle * dialog.getWindow(). RequestFeature (-) * ile niçin getWindow üzerinde "diyalogu dahil etmelisiniz" diye merak ediyorum. – Fattie

+5

Bu bir ipucu değil. Bir parça, diyaloğunuzu sarar, diyaloğun kendisi yerine parça ile uğraşmak zorunda olduğunuzdan normaldir;) –

+1

onCreateView'ı geçersiz kılmazsanız, setCancelable (false), public Dialog onCreateDialog'dan da çağrılabilir (Bundle savedInstanceState) – user2924714

41

aşağıdaki Snippet'ini

void showDialog() { 
    DialogFragment newFragment = MyAlertDialogFragment.newInstance(
      R.string..alert_dialog_two_buttons_title); 
    newFragment.setCancelable(false); 
    newFragment.show(getFragmentManager(), "dialog"); 
} 

kullanın ve doğrudan kullanmak zorunda setCancelable(false);

böylece güncellenen cevabı iletişim oluşturmanıza yardımcı uyarı oluşturucu kullanmak (ve muhtemelen her durumda bir DialogFragment iç iletişim sarın) durumunda bu

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.dialog_test, container, true); 
    getDialog().requestWindowFeature(STYLE_NO_TITLE); 
    setCancelable(false); 

    return view; 
} 
+1

Bu kabul edilen cevap olması gerektiği gibi olmalıdır. vanilya uyarısı iletişim parçaları ve özel iletişim parçaları için geçerlidir. –

25

gibi olacak, getDialog (lütfen kullanmayın) .setCancelable (false) veya Dialog.setCancelable (false) çünkü işe yaramayacak. API seviyesi gösterilen iletişim iptal olup olmadığını 11 Kontrol olarak

public void setCancelable (boolean cancelable) 

Ekleme: bu oficial robot belgelerinde bahsedilenleri aşağıdaki kodda gösterildiği gibi kullanımı setCancelable (yanlış). DialogFragment bu dayalı davranışını değiştirmek gerektiğinden, doğrudan Dialog.setCancelable (boolean) aramak yerine bu kullan "

ref:.. (Yanlış) http://developer.android.com/reference/android/app/DialogFragment.html#setCancelable(boolean) yerine getDialog ait

public class MyDialogFragment extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     View view = inflater.inflate(R.layout.dialog_layout, null, false); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) 
       .setTitle("in case you want use a title").setView(view); 

     AlertDialog alert = builder.create(); 
     // alert.setCancelable(false); <-- dont' use that instead use bellow approach 
     setCancelable(false); <- press back button not cancel dialog, this one works fine 
     alert.setCanceledOnTouchOutside(false); <- to cancel outside touch 

     return alert; 
} 
+0

Evet Ben çözüm üzerinde deneyin, ama kontrol etmek için değil, benim için işe yaramazsa, bu cevap yeni upvoted için zamana ihtiyacım var, yine de teşekkürler. – Xenione

+0

Bu, Android'in tarafındaki bu davranışın oldukça garip olsa da, diyaloğunuzu oluşturmak için örneğin AlertDialog.Builder'i kullandığınız gibi, bu özelliklerin alt sınıfları geçersiz kılacağını düşünürseniz de doğrudur. Ama burada bir şey özlemişimdir? – Robert

+0

Bence diyalog, AlertDialog'a tepki göstermeyen bir dialogfragmente sarılmadan sonra ya da büyükbabamda da yandıktan sonra. Bence her şey onun yerine fragmentDialog'a gider. – Xenione

İlgili konular