2012-03-07 3 views
23

Wiem, że kiedy pierwszy raz tworzysz fragment, możesz przekazać argumenty używając setArguments(Bundle) i pobrać je w tym fragmencie, używając .Czy jest możliwe przekazanie argumentów do fragmentu po dodaniu go do działania?

Jednak w mojej aplikacji mam fragmenty, które będą odłączane i dołączane kilka razy po dodaniu do działania. Po ponownym dołączeniu może być konieczne przekazanie fragmentu argumentu w celu zmodyfikowania jego zawartości przed ponownym podłączeniem. Mogę użyć setArguments przy pierwszym wyświetlaniu fragmentu, ale przy kolejnych okazjach, które nie będą działać. savedInstanceState nie zadziała w tym przypadku, ponieważ nie będę znał wartości argumentu przed odłączeniem fragmentu.

Wiem, że mógłbym zaimplementować metodę, którą powinienem nazwać przed dołączeniem fragmentu, który ustawiłby argument, ale wydaje się, że jest to coś, co może już być w API i po prostu go nie widzę.

Czy jest coś wbudowanego, co pozwoli mi to zrobić, czy też będę musiał to wdrożyć na własną rękę? Dla rekordu używam pakietu wsparcia (v4).

Wielkie dzięki!

+0

Co masz na myśli przez ponowne dołączenie? Fragmenty zostaną dołączone do działania tylko raz (AFAIK) i jeśli zostaną oderwane od działania, zostaną zniszczone. Czy masz na myśli, że kiedy użytkownik kliknie przycisk Wstecz, fragment powraca do układu? – 500865

Odpowiedz

12

Możesz po prostu odsłonić na swoim fragmencie metodę, która ustawi, co chcesz przekazać. Aby go wywołać, możesz np. pobierz fragment z backstacku za pomocą tagu lub zachowaj referencję instancji z dowolnego miejsca, z którego ją wywołujesz.

To działa ładnie dla mnie, chociaż musisz być defensywny, jeśli chodzi o sprawdzanie wartości NULL, a także mieć świadomość tego, jak długo twój fragment przechodzi, kiedy go podłączasz lub uruchamiasz ponownie.

Z tego co mogę powiedzieć, nie ma nic w API ...

Aktualizacja: To jest prawdziwe i nadal działa dobrze. Zauważyłem, że gdy jest to bardziej złożone, jest znacznie czystsze i łatwiejsze w użyciu coś takiego jak Eventbus Otto. Gorąco polecam imho.

+0

Argument, który przekazuję, jest dość trywialny - nie jest on w rzeczywistości treścią, która zostanie dodana do fragmentu, ale fragment pokaże/ukryje treść w oparciu o jej wartość. Wydawało mi się to prawie zbyt proste, co sprawiło, że pomyślałem, że być może istnieje API dla tego, co robię. Chyba nie. Dzięki za pomoc! –

2

Czy można przekazać argumenty do fragmentu po dodaniu go do działania?

nr


Ale jeśli szukasz sposobów komunikowania się z działalnością, do której fragment jest związany, można zrobić to tak @manfred wspomniał lub inne sposoby opisane w Documentation

Istnieje jeszcze jeden ciekawy sposób, aby 2 fragmenty komunikowały się ze sobą. Jest to możliwe dzięki metodom setTargetFragment i getTargetFragment. Tutaj, jeśli fragmentB może wpływać fragmentA, będzie setTargetFragment z fragmentB do fragmentA i kiedy zmiany musi zostać zaktualizowany do fragmentA od wewnątrz fragmentB, dostaniesz odniesienie do niego przez ((fragmentA) getTargetFragment()) i dostęp do metody fragmentA go zaktualizować ty.

Mam nadzieję, że to pomaga. Powodzenia.

+0

nie pyta o komunikację z fragmentem, pyta jak zmienić argumenty raz ustawione na fragment –

+0

Twoje "nie" jest bardzo mylące i niepoprawne, odpowiedź na pytanie OP, które również zacytowałeś, jest doskonale odpowiedziana przez @ user3978046 powyżej –

19

Tak, jeśli wywołałeś setArguments (pakunek) zanim twój fragment stanie się aktywny. Następnie twój fragment po nim ma pakiet, który możesz zaktualizować.Aby uniknąć tego problemu, należy zaktualizować oryginalny pakiet i nie można wywoływać ponownie metody setArguments po raz drugi. Więc po początkowej budowy fragmentu, modyfikowanie fragmentów argumenty z kodem jak

frg.getArguments().putString("someKey", "someValue"); 

argumentów będzie wtedy dostępna w Twoim fragmentu i będzie utrzymywał i przywrócona podczas zmiany orientacji i takie.

Uwaga: ta metoda jest również przydatna, gdy fragment jest tworzony przez xml w układzie. Zazwyczaj nie można ustawić argumentów na takim fragmencie; Sposobem na uniknięcie tego ograniczenia jest utworzenie konstruktora żaden argument, który tworzy wiązka argumentem tak:

public MyFragment() { 
    this.setArguments(new Bundle()); 
} 

Później gdzieś w metodzie onCreate swoją aktywność byłby wtedy zrobić:

FragmentManager mgr = this.getSupportFragmentManager(); 
Fragment frg = mgr.findFragmentById(R.id.gl_frgMyFragment); 
Bundle bdl = frg.getArguments(); 
bdl.putSerializable(MyFragment.ATTR_SOMEATTR, someData); 

Stawia to dane do pakietu argumentów, który następnie będzie dostępny do kodowania w twoim fragmencie.

+0

Tak, ale czy istnieje sposób, aby twój fragment zauważył, że dodałeś argumenty do pakietu? Przypuszczam, że mógłbym dodać argumenty, a następnie odsłonić metodę na fragmencie, który aktywność może wywołać, zmuszając ją do ponownego sprawdzenia argumentów. Problem polega na tym, że działanie nie wie, na jakim etapie cyklu życia znajduje się fragment. – Glaucus