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„s add(int, Fragment)metody. Jednak nie określa to identyfikatora fragmentu. Określa identyfikator a, ViewGroupdo którego należy wstawić Fragment. Nie jest to przydatne do celu, którego oczekuję, ponieważ nie identyfikuje jednoznacznie Fragments, ale ViewGroups. Te identyfikatory dotyczą kontenerów , do których można dynamicznie dodać jeden lub więcej fragmentów. Używanie takiej metody do identyfikowania Fragments wymagałoby ViewGroupdynamicznego dodawania s do układu przy każdym Fragmentwstawianiu. 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 i FragmentManager” 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 . Fragmentnie muszą mieć View! Mogą być również używane do utrzymywania efemerycznego stanu między zmianami konfiguracji!
Okazuje się, że nie musisz znać identyfikatora fragmentu.
Z dokumentów:
public abstract Fragment findFragmentById (int id)
Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.
Ważną częścią jest „jako identyfikator kontenera po dodaniu w transakcji”.
więc:
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_holder, new AwesomeFragment())
.commit();
i wtedy
AwesomeFragment awesome = (AwesomeFragment)
getSupportFragmentManager()
.findFragmentById(R.id.fragment_holder);
dostaniesz jakikolwiek (niesamowity) fragment przechowywany w R.id.fragment_holder.
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.
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, DialogFragmentlub zwykły stary Fragment(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!
Użyj następujących:
Aby dodać fragment:
getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();
Aby zidentyfikować istniejący fragment:
getFragmentManager().findFragmentByTag(fragmentName);
Używając tagu, pamiętaj, aby dodać rozszerzenie
fragmentTransaction.addToBackStack(null);
tak, aby Twój fragment wznowił, a nie został zniszczony, jak wspomniano w przewodnikach programistów.
Jeśli nie wywołasz addToBackStack () podczas wykonywania transakcji, która usuwa fragment, to ten fragment zostanie zniszczony, gdy transakcja zostanie zatwierdzona i użytkownik nie będzie mógł do niego wrócić. Natomiast jeśli wywołasz addToBackStack () podczas usuwania fragmentu, to fragment zostanie zatrzymany i później wznowiony, jeśli użytkownik przejdzie wstecz.
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