2013-07-22 75 views
12

Jestem naprawdę zdezorientowany wewnętrznym stanem fragmentu. Mam Aktywność, która ma tylko jeden Fragment na raz i zastępuje go, jeśli powinien zostać pokazany inny Fragment. Z dokumentacji onSaveInstanceState jest wywoływana TYLKO, jeśli wywoływana jest aktywność onSaveInstanceState (która nie jest wywoływana w moim przypadku).Jak działa funkcja `onViewStateRestored` from Fragments?

Jeśli zatrzymam mój Fragment, przechowam jego stan w Singleton (tak, wiem, że nienawidzę Singletonów, ale nie był to mój pomysł). Więc muszę odtworzyć cały ViewHirarchy, utworzyć nowe widoki (używając słowa kluczowego new), przywrócić jego stan i zwrócić je w onCreateView. Mam również pole wyboru wewnątrz tego widoku, z którego wyraźnie chcę NOT chcesz zapisać jego stan.

Jednak FragmentManager chce być „inteligentna” i wzywa onViewStateRestored z wiązką Nigdy sobie stworzył, a „przywraca” stan starego CheckBox i stosuje ją do mojego nowego wyboru. To powoduje wiele pytań:

Czy mogę kontrolować pakiet z onViewStateRestored?

W jaki sposób FragmentManager przyjmuje stan (prawdopodobnie zbieranego ze śmieci) CheckBoxa i stosuje go do nowego?

Dlaczego tylko zapisać stan pola wyboru (nie z TextView ??)

Więc Podsumowując: Jak onViewStateRestored pracę?

Uwaga używam Fragmentv4, więc nie ma API> 17 wymagana onViewStateRestored

Odpowiedz

17

Cóż, czasami fragmenty może być trochę mylące, ale po jakimś czasie można się do nich przyzwyczaić i nauczyć się, że są one swoje przyjaciele po wszystkim.

Jeśli używasz metody onCreate() fragmentu, wykonaj: setRetainInstance (true); Widoczny stan twoich poglądów zostanie zachowany, inaczej nie będzie.

Załóżmy fragment o nazwie „f” klasy F, jej etapów pójdzie tak: - Przy uruchamianiu/mocowania/pokazując go, to są metody 'F', że nazywane są w następującej kolejności:

F.newInstance(); 
F(); 
F.onCreate(); 
F.onCreateView(); 
F.onViewStateRestored; 
F.onResume(); 

W tym momencie twój fragment będzie widoczny na ekranie. Załóżmy, że urządzenie zostało obrócone, dlatego informacje o fragmencie muszą zostać zachowane, jest to przepływ zdarzeń wywołanych obrotem:

F.onSaveInstanceState(); //save your info, before the fragment is destroyed, HERE YOU CAN CONTROL THE SAVED BUNDLE, CHECK EXAMPLE BELLOW. 
F.onDestroyView(); //destroy any extra allocations your have made 
//here starts f's restore process 
F.onCreateView(); //f's view will be recreated 
F.onViewStateRestored(); //load your info and restore the state of f's view 
F.onResume(); //this method is called when your fragment is restoring its focus, sometimes you will need to insert some code here. 


//store the information using the correct types, according to your variables. 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putSerializable("foo", this.foo); 
    outState.putBoolean("bar", true); 
} 

@Override 
public void onViewStateRestored(Bundle inState) { 
    super.onViewStateRestored(inState); 
    if(inState!=null) { 
     if (inState.getBoolean("bar", false)) { 
      this.foo = (ArrayList<HashMap<String, Double>>) inState.getSerializable("foo"); 
     } 
    } 

}