2013-03-25 14 views
21

Mam fragmenty, które trzymam w backstackach FragmentManager. Każdy stan fragment jest zapisywany do zmiany orientacji zmiennych składowych, jak to na przykład:Używanie onSaveInstanceState z fragmentami w backstacku?

@Override 
public void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    outState.putLong("userId", mUserId); 
    outState.putString("username", mUsername); 
} 

Moim problemem jest to, że jeśli jest zmiana orientacji, ponieważ każdy fragment w backstack jest wywoływana poprzez onSaveInstanceState, otrzymuję null wyjątek wskaźnika, ponieważ zmienne składowe już nie istnieją.

Wszelkie pomysły na rozwiązanie tego problemu?

+0

Czy możesz podać swój komunikat o błędzie logcat? –

+0

Funkcja onSaveInstanceState jest wywoływana przed zastosowaniem obowiązującej zmiany, więc zmienne powinny istnieć po ich wywołaniu, chyba że są one puste z powodu innych błędów w kodzie. Dodaj trochę więcej kodu wraz z formularzem wyjściowym błędu Logcat. – Shade

+0

Mogę zapewnić, że moje zmienne są w porządku. Myślę, że problem polega na tym, że moje fragmenty w backstacku nie są wywoływane na SaveInstanceState, gdy są zrywane; Parametr onSaveInstanceState jest wywoływany tylko wtedy, gdy działanie jest niszczone, ale moje zmienne już nie istnieją. Więc moje obecne rozwiązanie to: "if (mUserId! = Null && mUsername! = Null) ...". Nie jest ładny, ale rozwiązuje problem. Uważam to za dziwne, gdy używam metody onSaveInstanceState dla fragmentów, jeśli nie zostanie ona wywołana, gdy fragment zostanie zburzony. –

Odpowiedz

34

Możliwe, że zmienne członkowskie już nie istnieją, ponieważ FragmentManager w twoim Activity umiera ze wszystkimi swoimi fragmentami.

trzeba zastąpić metodę onSaveInstanceState swojej klasie Activity jak dobrze, bo trzeba zapisać stan Activity przed zapisaniem stanu Fragments.

Jako documentation mówi:

Istnieje wiele sytuacji, w których fragment może być głównie rozdarty dół (jak w przypadku umieszczenia na tylnej stosu bez UI pokazano), ale jego stan nie będą zapisywane, dopóki jego własna aktywność faktycznie musi uratować jej stan.

UPDATE

W swojej ActivityonSaveInstanceState i onRestoreInstanceState, spróbuj oszczędzając Fragment odniesienia, a następnie przywrócić je z czymś takim:

public void onSaveInstanceState(Bundle outState){ 
    getFragmentManager().putFragment(outState,"myfragment",myfragment); 
} 
public void onRestoreInstanceState(Bundle inState){ 
    myFragment = getFragmentManager().getFragment(inState,"myfragment"); 
} 

Powiedz mi wówczas, jeśli miał szczęście! :-)

+0

Co powinienem zrobić? Czy powinienem wywołać fragment onSaveInstanceState z obiektu onSaveInstanceState? –

+0

AKTUALIZACJA dla ciebie w odpowiedzi. –

+0

ok ... więc onSaveInstanceState dla fragmentów jest prawie bezwartościowe. Przynajmniej dla fragmentów (transakcji fragmentów), które znajdują się w tylnym stosie. –

0

Czy ustawienie setRetainInstance na pomoc fragmentu. wypróbować

+0

Jeśli fragment jest używany do celów interfejsu użytkownika, nigdy "setRetainInstance" na "true"! – matusalem

5

budynku na Jorge Gil - „xɔɾ.xɛ Xil odpowiedź pamiętać, że:

  • Nie zapomnij zadzwonić Super implementacje onSaveInstanceState() i onRestoreInstanceState().
  • Jeśli korzystasz z pakietu wsparcia: Użyj getSupportFragmentManager() zamiast getFragmentManager().
  • Podczas pobierania oryginalnego fragmentu musisz go przesłać.

Przepraszam za bycie kapitanem oczywistym!

0

Myślę, że właściwym rozwiązaniem jest odczytanie tych zmiennych członkowskich z savedInstanceState w onCreate, który wydaje się być nazywany zawsze przed onSaveInstanceState. Jeśli przetwarzasz pola w onViewCreated, nie mają one możliwości zainicjowania przed następnym onSaveInstanceState (w tym szczególnym przypadku, gdy Fragment znajduje się w backstacku).

Powiązane problemy