DialogFragment setCancelable nie działa

104

Pracuję w aplikacji na Androida i używam DialogFragment, aby wyświetlić okno dialogowe i chcę, aby ten DialogFragment nie był anulowany. Ustawiłem właściwość anulowania okna dialogowego na wartość false, ale nadal nie ma to wpływu.

Proszę zajrzeć do mojego kodu i zasugerować mi rozwiązanie.

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;
    }
 }
Bieg
źródło
29
zamiast getDialog (). setCancelable (false); powinieneś wywołać setCancelable (false);
Blackbelt
jeśli klikniesz poza granicami okna dialogowego, należy je również odrzucić?
Usman Kurd
Próbujesz kanapki z lodami? Proszę odnieść się do wspomnianego linku fantasypubl Furniture.com/morePhpHelp/ ...
Remmyabhavan

Odpowiedzi:

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

zamiast tego getDialog().setCancelable(false);musisz używać bezpośredniosetCancelable(false);

więc zaktualizowana odpowiedź będzie taka

@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;
}
Czarny pas
źródło
To naprawdę niesamowita wskazówka, DZIĘKI. Zastanawiam się, dlaczego, powiedzmy dialog.getWindow (). RequestFeature (-) , musisz „dołączyć okno dialogowe” do getWindow?
Fattie
7
To nie jest wskazówka. Fragment zawija twój dialog, to normalne, że musisz zająć się fragmentem zamiast samym dialogiem;)
andrea.rinaldi
1
W przypadku, gdy nie zastąpisz onCreateView, setCancelable (false) można również wywołać z publicznego okna dialogowego onCreateDialog (pakiet zapisanyInstanceState)
user2924714
2
Nie działa dla mnie. Okno dialogowe jest nadal zamykane po kliknięciu przycisku Wstecz.
Pinkesh Darji
@Blackbelt Mam podobny przypadek użycia, ale w moim przypadku dotknięcie poza oknem dialogowym nie zamyka okna. Używam DatePicker w DialogFragment. Czego użyłbym jako „R.layout.dialog_test” w Twojej odpowiedzi powyżej? Moje pełne pytanie znajduje się tutaj: stackoverflow.com/questions/59825258/ ...
AJW
53

Użyj następującego fragmentu

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

a jeśli chcesz wyłączyć dotykanie strony zewnętrznej wokół okna dialogowego, użyj następującego wiersza kodu

DialogFragment.getDialog().setCanceledOnTouchOutside(true);
Usman Kurd
źródło
1
Powinna to być akceptowana odpowiedź, ponieważ ma zastosowanie zarówno do fragmentów okien dialogowych z alertami wanilii, jak i fragmentów niestandardowych okien dialogowych.
Ganesh Mohan
29

Jeśli używasz narzędzia do tworzenia alertów (i prawdopodobnie w każdym przypadku zawijasz okno dialogowe wewnątrz DialogFragment), aby pomóc w tworzeniu okna dialogowego, nie używaj metody getDialog (). SetCancelable (false) lub Dialog.setCancelable (false), ponieważ to nie będzie praca. Użyj setCancelable (false), jak pokazano w kodzie poniżej, jak wspomniano w oficjalnej dokumentacji Androida:

public void setCancelable (boolean cancelable)

Dodano na poziomie API 11. Kontroluje, czy wyświetlane okno dialogowe można anulować. Użyj tego zamiast bezpośredniego wywoływania Dialog.setCancelable (boolean), ponieważ DialogFragment musi zmienić swoje zachowanie na tej podstawie. "

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;
}
Xenione
źródło
Tak, wypróbowuję powyższe rozwiązanie, nawet zaznaczone, ale u mnie nie działa, ta odpowiedź jest nowa, więc potrzebuję czasu na uznanie, mimo wszystko dzięki.
Xenione
Cóż, to prawda, nawet jeśli uważam, że to zachowanie ze strony Androida jest dość dziwne, ponieważ jawnie używasz na przykład AlertDialog.Builder do budowania swojego okna dialogowego, możesz pomyśleć, że te atrybuty zastępują podklasy. Ale może czegoś tu brakuje?
Robert
Myślę, że zachowanie dialogowe po zawinięciu w fragment okna dialogowego nie reaguje już na AlertDialog lub co najmniej na koniec. Myślę, że zamiast tego wszystko przechodzi przez fragmentDialog.
Xenione,
Dzięki! Przez cały czas używałem alert.setCancelable (false) i nie mogłem zrozumieć, dlaczego to nie zadziała.
Aldo
1

Proste rozwiązanie w DialogFragment

Używany

dialog.setCanceledOnTouchOutside(false)
Mirza Adil
źródło