2011-06-22 10 views
39

Mam aplikację, która używa fragmentów i bawiłam się, jak używać tego samego fragmentu w Aktywności z podwójnym panelem i Aktywnością jako samodzielną. Nadal nie jestem pewien co do najlepszej metody wykonania tego, ale zauważyłem, że FragmentManager ma funkcję putFragment i getFragment. To, co wprawia mnie w zakłopotanie, polega na tym, że musisz podać pakiet jako parametr zarówno dla funkcji pobierania, jak i umieszczania. W jaki sposób oddzielne zajęcia mogą mieć ten sam pakiet? Oczywiście możesz przekazać pakiet jako parametr, ale w tym momencie mam wrażenie, że po prostu robisz bałagan.Kiedy używać FragmentManager :: putFragment i getFragment

Jaki jest dobry scenariusz używania getFragment i putFragment? Dołącz wyjaśnienie parametrów pakietu.

+1

wiem, że 'putFragment' będzie używana w połączeniu z' onSaveInstanceState' aby zachować odniesienie do fragmentu, jeżeli działalność jest zniszczona na powiedzmy zmianie orientacji lub jeśli system operacyjny musi odzyskać pamięć, z fragment jest pobierany w powiedz 'onCreate (...)'.Dobrze byłoby wiedzieć, kiedy możesz chcieć zachować referencję. Właśnie skończyłem projekt portu fragmentów, w którym nigdy tego nie robiłem, chociaż może powinienem. – PJL

+0

Mam układ dwóch okien dla krajobrazu i portretu, dla których czynności są odtwarzane po zmianie orientacji. Podczas zmiany orientacji moje fragmenty zostaną odtworzone i wczytane do ich kontenerów, tak jak wspomniano powyżej, nie znalazłem potrzeby używania 'put | getFragment', więc dobre przykłady użycia będą dobre. – PJL

+1

Niesamowicie idiotyczna architektura Androida zabija mnie ... – syloc

Odpowiedz

59

odpowiedź podstawowy.

Są one użyteczne tylko podczas implementacji metody onSaveInstanceState() i przywracania tego stanu w onCreate(). Jeśli nie implementujesz metody SaveSstanceState(), możesz zapomnieć o tych metodach i udawać, że nie istnieją.

Problem, który rozwiązują: jeśli chcesz zapisać odniesienie do fragmentu w "stanie zapisanej instancji", nie możesz po prostu umieścić tam odwołania do obiektu. Po pierwsze dlatego, że nie można umieścić zwykłego przedmiotu w pakiecie. :) A powodem tego jest to, że punktem tego zapisanego stanu jest skopiowanie go z procesu, więc jeśli twój proces wymaga zabicia, może być później skopiowany z powrotem do nowego procesu, abyś mógł ponownie -inicjalizuj aktywność/fragment z. Surowy obiekt ma znaczenie tylko w kontekście procesu, w którym działa, więc nie jest możliwe prawidłowe skopiowanie odniesienia do takiego obiektu poza bieżący proces i do innego.

Więc to, co putFragment()/getFragment() robi, umieszcza fragment danych w danym pakiecie, który może zidentyfikować ten fragment do nowej instancji aktywności/fragmentu w innym procesie. Dokładnie to, czym jest ta reprezentacja, nie jest zdefiniowane, ale w obecnej implementacji jest to wewnętrzny identyfikator liczby całkowitej dla tego fragmentu, który zostanie użyty później, gdy FragmentManager będzie musiał ponownie utworzyć ten fragment z wcześniej zapisanego stanu ... ponownie utworzony z tym samym identyfikatorem, więc gdy następnie wywołasz funkcję getFragment(), może pobrać liczbę całkowitą i użyć jej do określenia poprawnego obiektu Fragment, aby powrócić do wywołującego, który odpowiada zapisanemu wcześniej.

+0

To sprawia, że ​​mnóstwo sensu. Dzięki hackbod – Spidy

+0

Jeszcze raz dziękuję. Przykro nam z wakacji, więc nie mogłem przyznać nagrody. – PJL

+6

Czy to nie może zostać zaimplementowane przez getFragmentManager(). FindFragmentByTag() za każdym razem w onCreate? – Enigma

1

Masz ładne wyjaśnienie, do czego można użyć put|getFragment w tym android group thread.

Choć cały wątek jest interesujący, prawdziwa odpowiedź na pytanie została udzielona przez Dianne Hackborn”

Można również skorzystać z FragmentManager API zapisać fragment«wskaźnik»w wiązce i później odzyskać, co pozwala na bezpośrednie utrzymać wskaźniki całej stanu zapisu/odczytu

+1

Dzięki za referencje. Nadal jestem trochę niepewny, czytając to, kiedy najlepiej mogę użyć tych metod (może to być tak, że po prostu tego nie rozumiem). Użyłem tych metod do pobierania fragmentów według tagów i użyłem detektora ... Szkoda, że ​​próbka demo API nie zawiera użycia tych metod. – PJL

+1

@PJL: Czy używałeś kiedyś 'onSaveInstanceState'? Oto wspaniała odpowiedź na ten temat od Reto Meier: http://stackoverflow.com/questions/151777/how-do-i-save-an-android-applications -state 'put | getFragment', jak wspomniała Dianne, używaj dokładnie tego, ale w przypadku 'Fragmentów'. – Macarse

+0

Dzięki za link. Używam 'onSaveInstanceState', tj. Dla mojej lewej listy fragmentów z dwoma panelami używam jej do zapisania aktualnie wybranej pozycji (jak w FragmentLayout), jednak nie muszę komunikować się z fragmentem po prawej stronie. – PJL

17

W ten sposób można odzyskać referencję fragmentu po przywróceniu Activity. Na przykład, gdy utworzysz fragment i użyjesz go w całej aktywności, więc po zmianie konfiguracji twoja aktywność zostanie odtworzona, a ta referencja będzie z powrotem. Więc

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

nie zapomnij o tych super połączeniach –

+2

Nie możemy po prostu pobrać referencji fragmentu z FragmentManager? Jeśli tak, to dlaczego miałbym umieścić go w savedInstanceState? – azizbekian