Gram z fragmentami w Androidzie.
Wiem, że mogę zmienić fragment, używając następującego kodu:
FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();
MyFragment myFragment = new MyFragment(); //my custom fragment
fragTrans.replace(android.R.id.content, myFragment);
fragTrans.addToBackStack(null);
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();
Moje pytanie brzmi: w pliku Java, jak mogę uzyskać aktualnie wyświetlaną instancję Fragment?
Odpowiedzi:
Po dodaniu fragmentu do transakcji należy użyć znacznika.
... a później, jeśli chcesz sprawdzić, czy fragment jest widoczny:
Zobacz także http://developer.android.com/reference/android/app/Fragment.html
źródło
Wiem, że to stary post, ale wcześniej miałem z tym problem. Znaleziono rozwiązanie, które miało to zrobić w
onBackStackChanged()
funkcji odsłuchuTo działało dla mnie, ponieważ nie chciałem powtarzać każdego fragmentu, który muszę znaleźć, który jest widoczny. Mam nadzieję, że pomoże to również komuś innemu.
źródło
.getFragmentManager
raportów typu niezgodnego, tak jak w moim przypadku, dzieje się tak, ponieważ korzystałem zandroid.support.app.v4.Fragment
, w którym to przypadku właściwą metodą jestgetSupportFragmentManager
findFragmentByTag()
zamiastfindFragmentById
, jeśli podałeś tag do fragmentowania podczas dodawania go dofragmentManager.beginTransaction() .add(containerID, frag, fragmentTag) .addToBackStack(fragmentTag) .commit();
Oto moje rozwiązanie, które uważam za przydatne w scenariuszach z niskim fragmentem
źródło
fragment
może mieć wartość null w niektórych scenariuszach, na przykład podczas otwierania tylnego stosu. Więc lepiej użyjif (fragment != null && fragment.isVisible())
.Za każdym razem, gdy pokazujesz fragment, musisz umieścić go w plecaku:
A kiedy potrzebujesz uzyskać aktualny fragment, możesz użyć tej metody:
źródło
addToBackStack(tag)
, ale co zrobić, jeśli nie chcesz dodać fragmentu do tylnego stosu?To, czego używam do znalezienia bieżącego fragmentu wyświetlania, znajduje się poniżej kodu. To jest proste i do tej pory działa dla mnie. Działa w aktywności, która zawiera fragmenty
źródło
fragManager.getFragments().size()
zamiast,getBackStackEntryCount()
ponieważ niekoniecznie są one równe (w moim przypadku). W przeciwnym razie możesz dostać awarię z IndexOutOfBoundsExceptionSposób Kotlina;
źródło
getFragments()
, którą jest API 26 i nowsze.Reaktywne sposób:
źródło
Moja metoda oparta jest na try / catch:
Ale może być lepszy sposób ...
źródło
Cóż, to pytanie zyskało wiele poglądów i uwagi, ale wciąż nie zawierało najłatwiejszego rozwiązania z mojej strony - użycia getFragments ().
źródło
getSupportFragmentManager().getFragments()
daje ci listę, ale może zawierać wartości zerowe, jeśli najnowszy fragment został właśnie wyskakujący z backstacka. Eq: Jeśli sprawdzisz swoją drogę wewnątrzonBackStackChanged()
metody i wywołaszpopBackStack()
gdzieś, tomCurrentFragment
będzienull
.Możesz zapytać, który fragment jest załadowany do ramki treści Działania, i pobrać klasę fragmentu lub fragment „prostej nazwy” (jako ciąg).
Stosowanie:
Wyjścia:
źródło
Jest trochę późno, ale dla każdego, kto jest zainteresowany: jeśli znasz indeks żądanego fragmentu w FragmentManager, po prostu uzyskaj odwołanie do niego i sprawdź, czy jest funkcja isMenuVisible ()! tutaj:
Jeśli jest
true
widoczny dla użytkownika i tak dalej!źródło
isVisible() == true
,getView() != null
. Dodatkowo w moim kodziegetBackStackEntryCount
jest zawsze zero. Mimo że nie korzystam z menu,isMenuVisible()
to jak dotąd jedyna dyskryminacja, która wydaje się niezawodnie wskazywać na aktualnie „aktywny” fragment. ty1)
2)
3)
źródło
Jeśli się tu dostaniesz i korzystasz z Kotlin:
R.id.fragment_container
to miejsce, wid
którymfragment
prezentuje się na nichactivity
Lub jeśli chcesz ładniejszego rozwiązania:
źródło
Zainspirowany odpowiedzią Tainy , oto moje dwa centy. Trochę zmodyfikowany w stosunku do większości innych implementacji.
Zamień na
"myActivity"
„to”, jeśli jest to Twoja bieżąca aktywność, lub użyj odniesienia do swojej aktywności.źródło
Jest to metoda nazywa
findFragmentById()
sięSupportFragmentManager
. Używam go w kontenerze aktywności, takim jak:Tak zdobędziesz swój prąd
Fragment
. Jeśli masz niestandardowyFragment
i chcesz sprawdzić, coFragment
to jest, zwykle używaminstanceof
:źródło
Jeśli używasz
AndroidX Navigation
:Aby uzyskać więcej informacji na temat tego elementu nawigacyjnego: https://developer.android.com/guide/navigation/navigation-getting-started
źródło
your_navhost
.Jest to prosty sposób na uzyskanie bieżącego fragmentu.
źródło
Odpowiedź Seva działa, gdy naciśniesz przycisk Wstecz lub w inny sposób zmienisz plecak.
Zrobiłem jednak coś nieco innego. Mam konfigurację detektora zmian cofnięcia na podstawowym fragmencie i jego pochodnych fragmentach, a ten kod znajduje się w detektorze:
źródło
To dla mnie praca. Mam nadzieję, że to komuś pomoże.
źródło
Jeśli pobierasz bieżącą instancję Fragmentu z działania nadrzędnego, możesz to zrobić
To faktycznie jest bieżącą instancją fragmentu, który jest zapełniany w widoku. Miałem ten sam problem. Musiałem załadować ten sam fragment dwa razy, trzymając jeden z powrotem na stos.
Następująca metoda nie działa. Po prostu dostaje fragment, który ma tag. Nie trać czasu na tę metodę. Jestem pewien, że ma on swoje zastosowania, ale uzyskanie najnowszej wersji tego samego fragmentu nie jest jednym z nich.
źródło
Sprawdź to rozwiązanie. Udało mi się zdobyć obecny Fragment.
źródło
źródło
Sądzę, że jest to najprostsza odpowiedź na to pytanie. Mam nadzieję, że to pomoże.
źródło
Oto rozwiązanie Kotlin:
Uproszczony sposób:
źródło
Łatwy sposób to zrobić:
źródło
W głównym działaniu metoda onAttachFragment (fragment fragmentu) jest wywoływana, gdy do działania dołączany jest nowy fragment. W tej metodzie można uzyskać instancję bieżącego fragmentu. Jednak metoda onAttachFragment nie jest wywoływana, gdy fragment jest usuwany ze stosu, tj. Gdy naciśnięty jest przycisk Wstecz, aby uzyskać górny fragment na szczycie stosu. Nadal szukam metody wywołania zwrotnego, która jest uruchamiana w głównej aktywności, gdy fragment staje się widoczny w tej aktywności.
źródło
W przypadku przewijanych fragmentów, gdy używasz instancji klasy ViewPager, załóżmy, że mVeiwPager, możesz wywołać mViewPager.getCurrentItem () w celu uzyskania bieżącego numeru int.
w MainLayout.xml
w MainActivity.kt
źródło
Odkryłem, że
findFragmentByTag
to nie jest wygodne. Jeśli maszString currentFragmentTag
u swojegoActivity
lub rodzicaFragment
, musisz go zapisaćonSaveInstanceState
i przywrócićonCreate
. Nawet jeśli to zrobisz, poActivity
odtworzeniuonAttachFragment
zostanie wywołany wcześniejonCreate
, więc nie możesz użyćcurrentFragmentTag
wonAttachFragment
(np. Zaktualizować niektórych widoków na podstawiecurrentFragmentTag
), ponieważ może nie zostać jeszcze przywrócone.Używam następującego kodu:
Dokument
FragmentManager
stwierdzający, żeJeśli musisz robić rzeczy na podstawie bieżącego typu fragmentu, po prostu użyj
getCurrentFragment() instance of MyFragment
zamiastcurrentFragmentTag.equals("my_fragment_tag")
.Zauważ, że
getCurrentFragment()
wonAttachFragment
nie otrzyma załączaniaFragment
, ale poprzedni załączony.źródło
Musiałem to zrobić bardzo niedawno i żadna z odpowiedzi tutaj nie pasowała do tego scenariusza.
Jeśli masz pewność, że widoczny będzie tylko jeden fragment (pełny ekran), więc naprawdę chcesz znaleźć to, co znajduje się na górze plecaka. Na przykład, jak
Kotlin
naFragment
:I używaj go w następujący sposób:
źródło
Możesz to zrobić bardzo łatwo również za pomocą adresu URL w logcat, który przekieruje cię do kodu źródłowego bieżącego kodu źródłowego fragmentu. Najpierw musisz dodać OnBackStackChangedListener do działania hosta, takiego jak -
A implementacja OnBackStackChangedListener to -
A metoda getStackTopName () to -
źródło