Android - ustaw identyfikator fragmentu

111

Jak mogę ustawić Fragment„s Idtak, że mogę użyć getSupportFragmentManager().findFragmentById(R.id.--)?

tyb
źródło
Możesz to ustawić w pliku xml układu
Vladimir Eremeev

Odpowiedzi:

117

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!

Thomas Dignan
źródło
Jeśli użyję tagu, a nie identyfikatora fragmentu, jak użyłbym wywołania zamiany, które wymaga identyfikatora zasobu fragmentu?
Namratha
12
@TomDignan A może fragment, który zostanie dodany w ViewPager? Jak mogę ustawić jego tag? Nie mogę używać transakcji w tej sytuacji.
GuilhE
1
@GuilhE Activity udostępnia metodę addFragment (), do której można odwoływać się ze strony viewpager. Utrzymanie tagu przedtem można to osiągnąć za pomocą skrótu.
Thomas Dignan,
1
Czy można nieco zmienić odpowiedź, aby podkreślić, że można ustawić id w układzie xml? Ponieważ osobiście nie czytałem innych pytań i miałem wrażenie, że w ogóle nie ma sposobu, aby ustawić id do fragmentu ...
Ivan
41

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.

Morały łosia
źródło
4

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.

user2014118
źródło
2

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!

dbm
źródło
0

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);
Jaydev
źródło
Odpowiedź nie dotyczy pytania. Zaktualizuj odpowiedź. Happy Coding
CodeWithVikas
-1

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

Panos Gr
źródło
-2

Oprócz odpowiedzi Toma, replace method obsługuje również znacznik fragmentu, oprócz add method.

oren zvi
źródło