11

Ich habe eine IllegalStateException auf zeigt ein DialogFragment:commitAllowingStateLoss auf DialogFragment

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 

ich weiß, warum es passiert, aber ich möchte zu verwenden commitAllowingStateLoss auf Dialog zeigt, die durch DialogFragment zwingende show Funktion:

public void show(FragmentManager manager, String tag) { 
    mDismissed = false; 
    mShownByMe = true; 
    FragmentTransaction ft = manager.beginTransaction(); 
    ft.add(this, tag); 
    ft.commit(); //replace it by commitAllowingStateLoss 
} 

aber ich habe keinen Zugriff auf mDismissed und mShownByMe Variablen, wie kann ich auf diese Variablen zugreifen, th zu ändern em wie es seine Eltern taten.

Antwort

23

glaube, ich warf IllegalStateException auf DialogFragment zu verhindern, könnte besser sein, zu verwenden:

YourDialogFragment dialogFragment = new YourDialogFragment(); 
fragmentManager.beginTransaction().add(dialogFragment, YourDialogFragment .TAG_FRAGMENT).commitAllowingStateLoss(); 

statt mit show() auf DialogFragment.

2

Die Lösung für commitAllowingStateLoss funktioniert, wenn Ihr DialogFragment keinen Status zum Speichern hat, sonst gehen sie verloren wie der Funktionsname. Aber ich denke, in den meisten Fällen haben wir einen Zustand zu speichern, das ist der große Vorteil von DialogFragment: Android erstellt es neu und behält seinen Status automatisch bei.

Eine bessere Lösung wäre es zu überprüfen, ob der Prozess neu erstellt, wenn nicht dann zurück zum Aufrufer, die entweder eine Aktivität oder eine FragmentActivity ist, sollte es markieren markieren und die Show-Funktion später wieder aufrufen in seiner onPostResume() oder onResumeFragments() Callback, mit dem wir sicherstellen können, dass alle Fragmente neu erstellt werden. Hier

ist eine überschriebene Show() von einer Unterklasse von DialogFragment:

public boolean show(FragmentManager fragmentManager) { 
    if (fragmentManager.isStateSaved()) return false; 
    show(fragmentManager, tagName); 
    return true; 
}