Die Eigenschaft DialogFragment setCancelable funktioniert nicht


101

Ich arbeite in einer Android-Anwendung und verwende ein DialogFragment, um ein Dialogfeld anzuzeigen. Ich möchte, dass dieses DialogFragment nicht stornierbar ist. Ich habe die Eigenschaft zum Abbrechen des Dialogfelds auf false gesetzt, aber sie wirkt sich immer noch nicht aus.

Bitte schauen Sie in meinen Code und schlagen Sie mir eine Lösung vor.

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

28
anstelle von getDialog (). setCancelable (false); Sie sollten setCancelable (false) aufrufen.
Blackbelt

Wenn Sie außerhalb der Grenzen des Dialogs klicken, muss dieser ebenfalls deaktiviert werden.
Usman Kurd

Versuchen Sie es mit einem Eiscremesandwich? Bitte lesen
Remmyabhavan

Antworten:


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

stattdessen getDialog().setCancelable(false);musst du direkt verwendensetCancelable(false);

Die aktualisierte Antwort wird also so aussehen

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

Das ist ein wirklich unglaublicher Tipp, DANKE. Ich frage mich, warum Sie mit say dialog.getWindow (). RequestFeature (-) den Dialog in das getWindow aufnehmen müssen.
Fattie

7
Es ist kein Tipp. Ein Fragment umschließt Ihren Dialog, es ist normal, dass Sie sich mit dem Fragment anstatt mit dem Dialog selbst befassen müssen;)
andrea.rinaldi

1
Falls Sie onCreateView nicht überschreiben, kann setCancelable (false) auch über den öffentlichen Dialog onCreateDialog (Bundle savedInstanceState)
user2924714 vom

2
Ich arbeite nicht für mich. Der Dialog wird beim Klicken auf die Schaltfläche "Zurück" weiterhin geschlossen.
Pinkesh Darji

@Blackbelt Ich habe einen ähnlichen Anwendungsfall, aber in meinem Fall wird der Dialog durch Berühren außerhalb des Dialogfelds nicht geschlossen. Ich verwende einen DatePicker im DialogFragment. Was würde ich für "R.layout.dialog_test" in Ihrer obigen Antwort verwenden? Meine vollständige Frage ist hier aufgeführt: stackoverflow.com/questions/59825258/…
AJW

51

Verwenden Sie das folgende Snippet

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

Wenn Sie den Dialog zum Berühren von außen deaktivieren möchten, verwenden Sie die folgende Codezeile

DialogFragment.getDialog().setCanceledOnTouchOutside(true);

1
Dies sollte die akzeptierte Antwort sein, da sie sowohl für Vanille-Warnungsdialogfragmente als auch für benutzerdefinierte Dialogfragmente gilt.
Ganesh Mohan

29

Wenn Sie den Alert Builder verwenden (und wahrscheinlich in jedem Fall den Dialog in ein DialogFragment einschließen), um Ihren Dialog zu erstellen, verwenden Sie bitte nicht getDialog (). SetCancelable (false) oder Dialog.setCancelable (false), da dies nicht der Fall ist Arbeit. Verwenden Sie setCancelable (false) wie im folgenden Code gezeigt, wie in der offiziellen Android-Dokumentation erwähnt:

public void setCancelable (boolean cancelable)

Hinzugefügt in API Level 11 Steuern Sie, ob der angezeigte Dialog abgebrochen werden kann. Verwenden Sie dies, anstatt Dialog.setCancelable (boolean) direkt aufzurufen, da DialogFragment sein Verhalten basierend darauf ändern muss. "

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

Ja, ich versuche die obige Lösung, auch die aktivierte, funktioniert aber nicht für mich. Diese Antwort ist neu, also brauche Zeit, um bewertet zu werden. Trotzdem danke.
Xenione

Nun, das ist wahr, auch wenn ich denke, dass dieses Verhalten von Android-Seite ziemlich seltsam ist, da Sie zum Beispiel explizit AlertDialog.Builder verwenden, um Ihren Dialog aufzubauen, würden Sie denken, dass diese Attribute die Unterklassen überschreiben. Aber ich vermisse hier vielleicht etwas?
Robert

Ich denke, Dialogverhalten nach dem Einwickeln in ein Dialogfragment, das nicht mehr auf den AlertDialog reagiert oder zumindest beim Bigining. Ich denke, stattdessen geht alles durch fragmentDialog.
Xenione

Vielen Dank! Ich habe die ganze Zeit über alert.setCancelable (false) verwendet und konnte nicht verstehen, warum es nicht funktionieren würde.
Aldo

0

Einfache Lösung in DialogFragment

Gebraucht

dialog.setCanceledOnTouchOutside(false)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.