DialogFragment setCancelable özelliği çalışmıyor


104

Bir android uygulamasında çalışıyorum ve bir iletişim kutusu göstermek için bir DialogFragment kullanıyorum ve bu DialogFragment'ı iptal edilemez yapmak istiyorum. Dialog cancelable özelliğini false olarak ayarladım, ancak yine de etkilemiyor.

Lütfen koduma bakın ve bana bir çözüm önerin.

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

29
getDialog () yerine setCancelable (false); setCancelable (false) 'ı çağırmalısınız;
Blackbelt

diyalog sınırlarının dışına tıklarsanız, aynı zamanda ortadan kaldırılmalıdır.
Usman Kurd

Dondurmalı sandviç mi deniyorsunuz? Lütfen belirtilen bağlantıya bakın fantasypublishings.com/morePhpHelp/…
Remmyabhavan

Yanıtlar:


243
@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;
}

getDialog().setCancelable(false);senin yerine doğrudan kullanmak zorundasınsetCancelable(false);

yani güncellenmiş cevap şöyle olacak

@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;
}

Bu gerçekten inanılmaz bir ipucu, TEŞEKKÜRLER. Acaba neden diyalog.getWindow (). RequestFeature (-) ile getWindow'a "diyaloğu dahil etmelisiniz"?
Şişko

7
Bu bir ipucu değil. Diyaloğunuzu bir fragman
sarıyor

1
OnCreateView öğesini geçersiz kılmamanız durumunda, setCancelable (false) ayrıca genel iletişim kutusundan onCreateDialog (Bundle SavedInstanceState)
user2924714

2
Benim için çalışmıyor. Geri düğmesine tıklandığında iletişim kutusu hala kapatılıyor.
Pinkesh Darji

@Blackbelt Benzer bir kullanım durumum var ama benim durumumda iletişim kutusunun dışındaki bir dokunuş iletişim kutusunu kapatmıyor. DialogFragment içinde bir DatePicker kullanıyorum. Yukarıdaki cevabınızda "R.layout.dialog_test" için ne kullanmalıyım? Tam sorum burada listelenmiştir: stackoverflow.com/questions/59825258/…
AJW

53

Aşağıdaki Snippet'i kullanın

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

ve dış taraf temas iletişimini devre dışı bırakmak istiyorsanız aşağıdaki kod satırını kullanın

DialogFragment.getDialog().setCanceledOnTouchOutside(true);

1
Bu, hem vanilya uyarısı iletişim kutusu parçaları hem de özel iletişim kutusu parçaları için geçerli olduğu için kabul edilen yanıt olmalıdır.
Ganesh Mohan

29

Diyaloğunuzu oluşturmanıza yardımcı olması için uyarı oluşturucu kullanıyorsanız (ve muhtemelen her durumda diyaloğu bir DialogFragment içine kaydırırsanız), lütfen getDialog (). SetCancelable (false) veya Dialog.setCancelable (false) kullanmayın çünkü iş. SetCancelable (false) 'i aşağıdaki kodda gösterildiği gibi, resmi android belgelerinde belirtildiği gibi kullanın:

public void setCancelable (boolean cancelable)

API seviyesi 11'de eklendi Gösterilen Diyalogun iptal edilebilir olup olmadığını kontrol edin. Dialog.setCancelable'ı (boolean) doğrudan çağırmak yerine bunu kullanın, çünkü DialogFragment davranışını buna göre değiştirmelidir. "

ref: http://developer.android.com/reference/android/app/DialogFragment.html#setCancelable(boolean)

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

Evet, yukarıdaki çözümü deniyorum, kontrol edilen bile olsa ama benim için işe yaramıyor, bu cevap yeni, bu yüzden yükseltilmesi için zamana ihtiyacım var, Yine de teşekkürler.
Xenione

Evet, bu doğru, Android açısından bu davranışın oldukça garip olduğunu düşünsem bile, diyaloğunuzu oluşturmak için örneğin AlertDialog.Builder'ı açıkça kullandığınız için, bu özelliklerin alt sınıfları geçersiz kıldığını düşünürdünüz. Ama burada bir şey eksik olabilir mi?
Robert

Sanırım diyalog davranışı bir diyalog parçasına sarıldıktan sonra artık AlertDialog'a yanıt vermiyor ya da en sonunda en önemlisi. Bence her şey bunun yerine fragmentDialog'a gidiyor.
Xenione

Teşekkürler! Tüm bu süre boyunca alert.setCancelable (false) kullanıyordum ve neden işe yaramayacağını anlayamadım.
Aldo

1

DialogFragment'da Basit Çözüm

Kullanılmış

dialog.setCanceledOnTouchOutside(false)
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.