W moim main.xml
mam
<FrameLayout
android:id="@+id/frameTitle"
android:padding="5dp"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:background="@drawable/title_bg">
<fragment
android:name="com.fragment.TitleFragment"
android:id="@+id/fragmentTag"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</FrameLayout>
I ustawiam obiekt fragmentu w ten sposób
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new FragmentType1();
fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag");
// fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Ustawia różne typy obiektów Fragment ( FragmentType2,FragmentType3,...
) w różnym czasie. Teraz w pewnym momencie muszę zidentyfikować, który obiekt obecnie się tam znajduje.
W skrócie muszę zrobić coś takiego:
Fragment currentFragment = //what is the way to get current fragment object in FrameLayout R.id.frameTitle
Wypróbowałem następujące
TitleFragment titleFragmentById = (TitleFragment) fragmentManager.findFragmentById(R.id.frameTitle);
i
TitleFragment titleFragmentByTag = (TitleFragment) fragmentManager.findFragmentByTag("fragmentTag");
Ale oba obiekty (titleFragmentById i titleFragmentByTag) są.null
Czy coś mi umknęło?
Używam Compatibility Package, r3
i rozwijam się dla API level 7
.
findFragmentById()
i findFragmentByTag()
będzie działać, jeśli ustawiliśmy fragment za pomocą fragmentTransaction.replace
lub fragmentTransaction.add
, ale będzie, return null
jeśli ustawiliśmy obiekt na xml (tak jak to, co zrobiłem w moim main.xml
). Myślę, że brakuje mi czegoś w moich plikach XML.
android
android-fragments
Labeeb Panampullan
źródło
źródło
Odpowiedzi:
Zadzwoń
findFragmentById()
naFragmentManager
i ustalić, który fragment jest wR.id.frameTitle
pojemniku.źródło
fragmentTransaction.replac
e lub,fragmentTransaction.add
ale nie otrzymamy, jeśli ustawiliśmy go na xml. Zobacz moją edycję 2findFragmentByTag
zwraca wartość null w przypadkuActionBar
tabulatorów. W moim,Activity
który jest rozszerzany,ActionBarActivity
najpierw dodaję karty,ActionBar
a potem je znajduję!executePendingTransactions()
naFragmentManager
po wywołaniucommit()
na transakcji, chociaż nie próbowałem tego. Możesz też użyćsetContentView()
pliku układu z<fragment>
tagiem. Każde z nich dzieje się synchronicznie, więc fragment będzie istniał w samymonCreate()
wywołaniu, w którym użyłeśexecutePendingTransaction()
lubsetContentView()
. W przeciwnym razie zwykłyFragmentTransaction
jest przetwarzany asynchronicznie i nie zacznie się nawet przed upływem czasuonCreate()
.Spróbuj tego,
to da ci aktualny fragment, potem możesz porównać go z klasą fragmentu i zrobić swoje.
źródło
getSupportFragmentManager()
zamiast tego i otrzymasz zero bezsupport
częściMyślę, że możesz użyć zdarzenia onAttachFragment, aby złapać, który fragment jest aktywny.
źródło
Myślę, że powinieneś zrobić:
Powodem jest to, że ustawiłeś znacznik „fragmentTag” na ostatni dodany fragment (podczas wywoływania zamiany).
źródło
fragmentTransaction.replac
e lub,fragmentTransaction.add
ale nie otrzymamy, jeśli ustawiliśmy go na xml. Zobacz moją edycję 2fragmentTag
jest tagiem dla bieżącego fragmentu?Możesz pobrać listę fragmentów i zajrzeć do ostatniego.
Ale czasami (po przejściu wstecz) rozmiar listy pozostaje taki sam, ale niektóre z ostatnich elementów są puste. Więc na liście iterowałem do ostatniego niezerowego fragmentu i użyłem go.
źródło
getFragments()
metody. Jest oznaczony@hide
i nie miał być dołączony do jar biblioteki wsparcia. Nie należy go traktować jako części eksportowanego interfejsu API.getFragments()
robi, ponieważ potrzebujesz jej dość często. Myślę, że jest teraz również publicznie dostępny.To najprostsze rozwiązanie i działa dla mnie.
1.) dodajesz swój fragment
2.)
źródło
Może być późno, ale mam nadzieję, że pomoże to komuś innemu, również @CommonsWare opublikował poprawną odpowiedź.
źródło
Może najprostszy sposób to:
U mnie to zadziałało
źródło
Możesz utworzyć pole w swojej rodzicielskiej klasie aktywności:
A następnie wewnątrz każdej klasy fragmentów:
Twoje pole 'fr' to aktualny fragment Object
Działa również z popBackStack ()
źródło
Wiem, że minęło trochę czasu, ale zrobię to tutaj na wypadek, gdyby to komuś pomogło.
Zdecydowanie właściwą odpowiedzią jest (i wybrana) odpowiedź z CommonsWare. Miałem ten sam problem, co wysłany, następujący
ciągle zwracał zero. Mój błąd był naprawdę głupi, w moim pliku xml:
Błąd polegał na tym, że miałem android: tag ZAMIAST android: id .
źródło
Odpowiedź @ Hammer zadziałała dla mnie, używam do sterowania pływającym przyciskiem akcji
źródło
Jeśli rozszerzasz z AbstractActivity, możesz użyć metody getFragments ():
źródło
Jeśli definiujesz fragment w warstwie XML działania,
Activity
upewnij się, że dzwoniszsetContentView()
przed wywołaniemfindFragmentById()
.źródło
Jeśli używasz BackStack ... I TYLKO jeśli używasz tylnego stosu, spróbuj tego:
źródło
W ten sposób otrzymasz aktualną nazwę klasy fragmentu ->
źródło
Sprawdź (który fragment w kontenerze aktywności) w metodzie onStart;
Niektórzy sprawdzają:
źródło