2012-02-20 19 views

Odpowiedz

100

Nie można ustawić programistycznie identyfikatora fragmentu.

Istnieje jednak String tag, który można ustawić wewnątrz FragmentTransaction, który może być użyty do jednoznacznej identyfikacji Fragmentu.

Jak zauważył Aleksey, można przekazać identyfikator FragmentTransaction za pomocą metody add(int, Fragment). Jednak nie określa to ID fragmentu. Określa identyfikator ViewGroup w celu wstawienia Fragment do. Nie jest to użyteczne w oczekiwanym przez ciebie celu, ponieważ nie jednoznacznie identyfikuje s. Fragment. Te identyfikatory są pojemnikami, że jeden fragment lub więcej może być dynamicznie dodawany. Zastosowanie takiej metody do identyfikacji Fragment s wymagałoby dynamicznego dodawania ViewGroup do układu dla każdego wstawianego Fragment. To byłoby dość kłopotliwe.

Więc jeśli pytanie brzmi: jak stworzyć niepowtarzalny identyfikator Fragment jesteś dodając dynamicznie, odpowiedź jest użycie FragmentTransaction „s add(int containerViewId, Fragment fragment, String tag) metoda i FragmentManagerfindFragmentByTag(String) metoda s.

W jednej z moich aplikacji musiałem dynamicznie generować ciągi. Ale i tak nie jest tak droga w stosunku do faktycznej FragmentTransaction.

Kolejną zaletą metody znaczników jest możliwość zidentyfikowania fragmentu, który nie jest dodawany do interfejsu użytkownika. Zobacz metodę FragmentTransaction: add(Fragment, String). Fragment s nie musi mieć View s! Mogą być również używane do utrzymywania efemerycznego stanu między zmianami konfiguracji!

+0

Gdybym użyć tagu, a nie ID dla fragmentu, w jaki sposób Używam zastępowania wywołania, które wymaga identyfikatora zasobu fragmentu? – Namratha

+0

@Namratha, nie możesz. –

+9

@TomDignan co powiesz na fragment, który zostanie dodany w ViewPager? Jak mogę ustawić jego tag? Nie mogę korzystać z transakcji w tej sytuacji. – GuilhE

3

W większości przypadków można użyć znacznika fragmentu oraz identyfikatora.
Możesz ustawić wartość zmiennej w FragmentTransaction.add(Fragment fragment, String tag);. Następnie można użyć polecenia FragmentManager.findFragmentByTag(String tab), aby znaleźć żądany fragment.

2

Jak już wspomnieli Tom i inni, istnieją sposoby na umieszczenie znacznika na fragmencie i użycie tego znacznika do identyfikacji. Kolejnym problemem, z którym spotkałem się z tymi rozwiązaniami, jest to, że fragment nie otrzymuje tagu, dopóki nie zostanie powiązany z Aktywnością (lub, faktycznie, z FragmentManager). Co zrobić, jeśli trzeba zidentyfikować fragment, zanim zostanie on oznaczony?

Moje dotychczasowe rozwiązania opierają się na najstarszej sztuczce (Java) na świecie: stwórz minimalistyczny fragment szablonu, który przyjmuje id w jednym z jego konstruktorów i zapewnia metodę getFragmentId(), która zwraca ten identyfikator. Pozwoliłem, aby fragmenty wymagające wczesnej identyfikacji rozszerzyły ten szablon; voila! Problem rozwiązany.

To rozwiązanie może niestety wymagają zestawu fragmentów matrycy, po jednej dla każdego typu fragmentów, ListFragment, DialogFragment lub zwykły stary Fragment (POFo ?!), które wymagają wczesną identyfikację. Ale jest to wykonalne w przypadku fragmentów, które myślę, biorąc pod uwagę uzyskane korzyści.

Przepraszamy za darcie gojenie ran :-)

Cheers!

35

Okazało się, że nie musisz znać identyfikatora fragmentu.

Od docs:

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 pojemnika po dodaniu w transakcji”.

tak:

getSupportFragmentManager() 
    .beginTransaction() 
    .add(R.id.fragment_holder, new AwesomeFragment()) 
    .commit(); 

a następnie

AwesomeFragment awesome = (AwesomeFragment) 
    getSupportFragmentManager() 
      .findFragmentById(R.id.fragment_holder); 

będzie Ci cokolwiek (niesamowite) fragment odbywa się w R.id.fragment_holder.

0

Oprócz odpowiedzi Toma, metoda replace również obsługuje tag fragmentu, oprócz metody dodawania.

1

użyć następujących:

Aby dodać fragment:

getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit(); 

identyfikacji istniejących fragment:

getFragmentManager().findFragmentByTag(fragmentName); 
Powiązane problemy