Verhindern, dass die Zurück-Schaltfläche ein DialogFragment abbricht
Lesezeit: 4 Minuten
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();
}
}
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
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
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;
}
11588000cookie-checkVerhindern, dass die Zurück-Schaltfläche ein DialogFragment abbrichtyes