11

Mam IllegalStateException na pokazując DialogFragment:commitAllowingStateLoss na DialogFragment

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

wiem, dlaczego jej dzieje, ale chcę, aby za pomocą commitAllowingStateLoss na pokazując okno nadrzędnymi DialogFragment show funkcja:

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 
} 

, ale nie mam dostępu do zmiennych mDismissed i mShownByMe, w jaki sposób uzyskać dostęp do tych zmiennych, aby zmodyfikować em jak to zrobił rodzic.

Odpowiedz

23

sądzę, aby zapobiec rzucając IllegalStateException na DialogFragment może być lepiej użyć:

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

zamiast korzystania show() na DialogFragment.

2

Rozwiązanie dotyczące commitAllowingStateLoss działa, jeśli twój DialogFragment nie ma stanu do zapisania, w przeciwnym razie zostaną utracone tak jak nazwa funkcji powiedział. Ale myślę, że w większości przypadków mamy stan do zapisania, to jest główna korzyść DialogFragment: Android odtwarza go i utrzymuje swój stan automatycznie.

Lepszym rozwiązaniem byłoby sprawdzenie, czy proces odtworzenia został wykonany, jeśli nie nastąpi powrót do osoby dzwoniącej, która jest aktywnością lub czynnością związaną z fragmentacją, powinien zadzwonić, zaznaczyć ją i ponownie wywołać funkcję pokazu później w swoim onPostResume() lub wywołanie zwrotne onResumeFragments(), dzięki któremu możemy odtworzyć wszystkie fragmenty.

Tutaj jest zastąpiona show() z podklasy DialogFragment:

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