Jak mogę ustawić Fragment
„s Id
tak, że mogę użyć getSupportFragmentManager().findFragmentById(R.id.--)
?
111
Jak mogę ustawić Fragment
„s Id
tak, że mogę użyć getSupportFragmentManager().findFragmentById(R.id.--)
?
Odpowiedzi:
Nie można programowo ustawić identyfikatora fragmentu .
Istnieje jednak element
String tag
, który można ustawić wewnątrz FragmentTransaction, który może służyć do jednoznacznej identyfikacji fragmentu.Jak Aleksey wskazał, można przekazać identyfikator do
FragmentTransaction
„sadd(int, Fragment)
metody. Jednak nie określa to identyfikatora fragmentu. Określa identyfikator a,ViewGroup
do którego należy wstawićFragment
. Nie jest to przydatne do celu, którego oczekuję, ponieważ nie identyfikuje jednoznacznieFragment
s, aleViewGroup
s. Te identyfikatory dotyczą kontenerów , do których można dynamicznie dodać jeden lub więcej fragmentów. Używanie takiej metody do identyfikowaniaFragment
s wymagałobyViewGroup
dynamicznego dodawania s do układu przy każdymFragment
wstawianiu. To byłoby dość uciążliwe.Więc jeśli pytanie brzmi, jak utworzyć unikatowy identyfikator dla Fragment dodajesz dynamicznie, odpowiedź jest użycie
FragmentTransaction
„s add (int containerViewId fragment fragment, Tag String) sposób iFragmentManager
” s findFragmentByTag (String) metody.W jednej z moich aplikacji byłem zmuszony do dynamicznego generowania ciągów. Ale i tak nie jest to tak drogie w porównaniu z rzeczywistą transakcją fragmentacji.
Inną zaletą metody tagów jest to, że może zidentyfikować fragment, który nie jest dodawany do interfejsu użytkownika. Zobacz metodę add (Fragment, String) FragmentTransaction .
Fragment
nie muszą miećView
! Mogą być również używane do utrzymywania efemerycznego stanu między zmianami konfiguracji!źródło
Okazuje się, że nie musisz znać identyfikatora fragmentu.
Z dokumentów:
Ważną częścią jest „jako identyfikator kontenera po dodaniu w transakcji”.
więc:
i wtedy
dostaniesz jakikolwiek (niesamowity) fragment przechowywany w R.id.fragment_holder.
źródło
W większości przypadków możesz użyć tagu fragmentu, jak również ID.
Możesz ustawić wartość tagu w
FragmentTransaction.add(Fragment fragment, String tag );
. Następnie możesz użyć polecenia,FragmentManager.findFragmentByTag(String tab)
aby znaleźć dany fragment.źródło
Jak już wspomniał Tomek i inni, istnieją sposoby na umieszczenie znacznika na fragmencie i użycie go do identyfikacji. Kolejnym problemem, na który natknąłem się z tymi rozwiązaniami, jest to, że fragment nie otrzymuje tagu, dopóki nie zostanie powiązany z działaniem (a właściwie z
FragmentManager
). Co zrobić, jeśli trzeba zidentyfikować fragment, zanim zostanie on oznaczony?Jak dotąd wszystkie moje rozwiązania opierają się na najstarszej (Java) sztuczce na świecie: stwórz minimalistyczny fragment szablonu, który pobiera identyfikator w jednym z jego konstruktorów i zapewnia
getFragmentId()
metodę, która zwraca ten identyfikator. Następnie pozwolę fragmentom, które wymagają wczesnej identyfikacji, rozszerzyć ten szablon i; voila! Problem rozwiązany.Rozwiązanie powyższe może niestety wymagają zestawu fragmentów matrycy, po jednej dla każdego typu fragmentu
ListFragment
,DialogFragment
lub zwykły staryFragment
(POFo ?!), które wymagają wczesną identyfikację. Ale wydaje mi się, że w przypadku fragmentów jest to możliwe, biorąc pod uwagę zapewnione korzyści.Przepraszam za rozrywanie gojących się ran :-)
Twoje zdrowie!
źródło
Użyj następujących:
Aby dodać fragment:
Aby zidentyfikować istniejący fragment:
źródło
Używając tagu, pamiętaj, aby dodać rozszerzenie
tak, aby Twój fragment wznowił, a nie został zniszczony, jak wspomniano w przewodnikach programistów.
Znajdziesz to na końcu tej strony .
Straciłem około 30 minut, próbując dowiedzieć się, dlaczego mój Fragment nie został znaleziony przez zwykłe
findFragmentByTag();
połączenieźródło
Oprócz odpowiedzi Toma, replace method obsługuje również znacznik fragmentu, oprócz add method.
źródło