2013-03-23 9 views
19

Podczas korzystania z FragmentActivity automatycznie przywraca stan fragmentów i odtwarza wszystkie fragmenty.Sposób automatycznego przywracania fragmentów działa

Wiem, że robi się to głównie zapisując stan w onSaveInstanceState, a następnie przywracając w działaniu onCreate. Przyglądając się nieco kodowi, widziałem, że wszystkie fragmenty są odtwarzane (lub dołączane tylko wtedy, gdy retainInstance jest prawdą) i dodane do FragmentManager, ale nie jest dla mnie jasne, w jaki sposób są one dodawane do widoku, ponieważ widok nie jest automatycznie przywrócony.

Moje oryginalne problemy polegały na tym, że otrzymałem duplikaty fragmentów podobnych do that other question. I workarrounded że onCreate z:

Fragment f = fm.findFragmentByTag(tagName); 
    if(f==null) { 
     f = createFragment(); 
     fm.beginTransaction().add(R.id.myContainer,f,tagName).commit(); 
    } else { 
    //Nothing it's on the view 
    } 

Teraz działa, ale jeszcze nie w pełni zrozumieć, jak to działa.

Moje wątpliwości to:

  • W którym momencie iw jaki sposób są fragmenty przymocowane do View? Eksperymentowałem, że odtworzenie fragmentu wykonano w onCreate z FragmentActivity. Ale jeśli później zadzwonię pod numer setContentView, w jaki sposób fragment dołącza się do widoku?
  • Czy mogę zapobiec odtwarzaniu fragmentów bez nadpisywania onSaveInstanceState? Ponieważ z powodu różnych układów orientacji z różną liczbą fragmentów, moim pierwotnym zamiarem było odtworzenie tylko jednego fragmentu stanu oznaczonego jako zatrzymany i nie przywracania innych fragmentów widoku, które nie zostały oznaczone jako zachowane.

Odpowiedz

7

Hierarchia widoków nie jest automatycznie przywracana. Tak więc, w Fragment.onCreateView() lub Activity.onCreate(), musisz przywrócić wszystkie widoki (z xml lub programowo). Każdy kod ViewGroup, który zawiera fragment, musi mieć ten sam identyfikator, co przy pierwszym utworzeniu. Po utworzeniu hierarchii widoków Android odtwarza wszystkie fragmenty i umieszcza ich widoki w prawo ViewGroup dzięki identyfikatorowi. Powiedzmy, że Android pamięta ID ViewGroup, na którym był fragment. Dzieje się to między onCreateView() i onStart().

Wydaje mi się, że odtworzenie fragmentów może być możliwe, ale w ViewGroup, w której znajduje się ten fragment, ustaw widoczność na GONE. W ten sposób fragment nie pojawia się i można go później programowo usunąć.

Powiązane problemy