Verhindern, dass die Zurück-Schaltfläche ein DialogFragment abbricht

Lesezeit: 4 Minuten

Benutzer-Avatar
MattF

Ich habe ein Fragment, das ein DialogFragment erstellen und öffnen kann, aber wenn ich auf die Schaltfläche „Zurück“ drücke, wird der Dialog geschlossen, obwohl ich ausdrücklich setCancelable(false) aufrufe. Gibt es eine Möglichkeit, dass mein DialogFragment für die Zurück-Schaltfläche unempfindlich ist?

public class LoadingDialogFragment extends DialogFragment
{
    String title;
    String msg;

    public LoadingDialogFragment()
    {
        this.title = "Loading...";
        this.msg = "Please wait...";
    }
    public LoadingDialogFragment(String title, String msg)
    {
        this.title = title;
        this.msg = msg;
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState)
    {
        final ProgressDialog dialog = new ProgressDialog(getActivity());

        dialog.setTitle(title);
        dialog.setMessage(msg);
        dialog.setIndeterminate(true);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setCancelable(false);

        return dialog;
    }

}

Ich erstelle das DialogFragment aus einer AsyncTask:

private class GpsTask extends AsyncTask<String, Integer, Integer>
{
    //ProgressDialog dialog;
    @Override
    protected void onPreExecute()
    {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        DialogFragment newFragment = new LoadingDialogFragment("Gathering Location", "Acquiring GPS lock...");
        ft.addToBackStack(null);
        newFragment.show(ft, "dialog");
    }

    @Override
    protected Integer doInBackground(String... params)
    {
        //acquire a GPS lock and grab a few position updates
    }

    @Override
    protected void onProgressUpdate(Integer... input) { }

    @Override
    protected void onPostExecute(Integer result)
    {
        getSupportFragmentManager().popBackStackImmediate();
    }
}

Benutzer-Avatar
Lalit Poptani

Wie wäre es mit verwenden setCancelable? Hast Du es versucht?

Aus den Dokumenten:

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

Für benutzerdefiniertes DialogFragment

Hinzufügen isCancelable = false bei onCreateDialog

  • Das ist richtig! Es stellt sich heraus, dass Sie setCancelable(false) für das DialogFragment selbst aufrufen müssen, nicht für den inneren Dialog, den es enthält!

    – MattF

    16. April 2012 um 10:02 Uhr

  • @MattF Dieser Kommentar ist ein Lebensretter. Wusste nicht, dass ich anrufen musste setCancelable() auf der DialogFragment anstelle von ProgressDialog. Vielen Dank!

    – prolink007

    22. September 2015 um 15:40 Uhr

  • ich benutzte isCancelable = false in Kotlin, innerhalb von onViewCreated und es hat funktioniert!!

    – Sieben

    26. Februar 2019 um 22:09 Uhr

  • Es funktioniert auch für mich @Seven, ich benutze isCancelable = false (nicht dialog.setCancelable(false))

    – Fernando Pérez

    19. Juli 2019 um 0:10 Uhr

  • Ich benutzte getDialog.setCancelable(false) und es hat nicht funktioniert, aber ich habe es durch ersetzt setCancelable(false) und es funktioniert richtig. das war komisch

    – Ehsan

    14. Dezember 2019 um 12:43 Uhr


 DialogFragment newFragment = YourFragment.newInstance();
                newFragment.setCancelable(false);
                newFragment.show(fragmentTransaction, "dialog");

Fügen Sie setCancelable(false) hinzu, bevor Sie das Fragment .Show() anzeigen

  • GROSSER Tipp. Und hier ist ein wichtiger weiterer Punkt dazu: stackoverflow.com/a/16480564/294884

    – Fett

    5. Juni 2014 um 8:19 Uhr

Benutzer-Avatar
Manavo

Ich bin mir überhaupt nicht sicher, ob dies mit FragmentDialogs funktioniert, aber wenn setCancelable bei Ihnen nicht funktioniert hat, könnte es sich lohnen, einen Blick auf diesen Artikel zu werfen: Android: Benutzer auffordern, Änderungen zu speichern, wenn die Schaltfläche „Zurück“ gedrückt wird

Es erklärt, wie man erkennt, dass die Zurück-Taste gedrückt wird. Vielleicht können Sie also das Drücken der Taste unterdrücken und es wird das Schließen des Dialogs stoppen?

  • Am Ende ging ich mit der anderen Antwort, aber ich denke, das funktioniert auch, vielen Dank

    – MattF

    16. April 2012 um 10:03 Uhr

onCreateDialog vs onCreateView:

Implementierungen sollten diese Klasse überschreiben und onCreateView(LayoutInflater, ViewGroup, Bundle) implementieren, um den Inhalt des Dialogs bereitzustellen. Alternativ können sie onCreateDialog(Bundle) überschreiben, um ein vollständig benutzerdefiniertes Dialogfeld mit eigenem Inhalt zu erstellen, z. B. ein AlertDialog.

Wichtig bei der Verwendung onCreateDialog:

Überschreiben Sie, um Ihren eigenen benutzerdefinierten Dialog-Container zu erstellen. Dies wird normalerweise verwendet, um einen AlertDialog anstelle eines generischen Dialogs anzuzeigen; dabei tut onCreateView(LayoutInflater, ViewGroup, Bundle). nicht müssen implementiert werden, da sich der AlertDialog um seinen eigenen Inhalt kümmert.

Beispiel Dialog (In diesem Fall ein AlertDialog):

public static class MyAlertDialogFragment extends DialogFragment {

    public static MyAlertDialogFragment newInstance(int title) {
        MyAlertDialogFragment frag = new MyAlertDialogFragment();
        Bundle args = new Bundle();
        args.putInt("title", title);
        frag.setArguments(args);
        return frag;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        int title = getArguments().getInt("title");

        return new AlertDialog.Builder(getActivity())
                .setIcon(R.drawable.alert_dialog_icon)
                .setTitle(title)
                .setCanceble(false)
                .setPositiveButton(R.string.alert_dialog_ok,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((FragmentAlertDialog)getActivity()).doPositiveClick();
                        }
                    }
                )
                .setNegativeButton(R.string.alert_dialog_cancel,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((FragmentAlertDialog)getActivity()).doNegativeClick();
                        }
                    }
                )
                .create();
    }
} 

Die Eigenschaft setCanceble(boolean) gibt an, ob Sie das beenden können Dialog mit Rückenpresse. Keine Notwendigkeit, den KEYCODE_BACK irgendwo zu fangen.

Es kann Ihnen helfen.

newFragment.setCancelable(false); 

Nehmen Sie Änderungen wie oben vor, wenn Sie das DialogFragment-Objekt oder im Konstruktor des benutzerdefinierten DialogFragments wie im folgenden Beispiel erstellen.

public static CustomClearHourDialog newInstance(Bundle args, IDialogListener listener)
        {
            CustomClearHourDialog clearHourDialog = new CustomClearHourDialog();            
            CustomClearHourDialog.listener = listener;
            clearHourDialog.setCancelable(false);
            return clearHourDialog;
        }

1158800cookie-checkVerhindern, dass die Zurück-Schaltfläche ein DialogFragment abbricht

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy