Jak mogę dodać najnowszą instancję fragmentu do backstacku (jeśli nie znam tagu i identyfikatora fragmentu)?
FragmentManager fragManager = activity.getSupportFragmentManager();
FragmentTransaction fragTransacion = fragMgr.beginTransaction();
/****After add , replace fragments
(some of the fragments are add to backstack , some are not)***/
//HERE, How can I get the latest added fragment from backstack ??
android
android-fragments
back-stack
Leem.fin
źródło
źródło
FragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
lubFragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
docstack
jeśli nie mogę uzyskać dostępu do fragmentu metodą pop?funkcja zwraca link do góry
Fragment
w backstacku. Przykład użycia:źródło
Osobiście wypróbowałem wiele z tych rozwiązań i otrzymałem to działające rozwiązanie:
Dodaj tę metodę narzędziową, która będzie używana kilka razy poniżej, aby uzyskać liczbę fragmentów w twoim stosie:
Następnie, kiedy dodajesz / zastępujesz swój fragment metodą FragmentTransaction, wygeneruj unikalny tag do swojego fragmentu (np .: wykorzystując liczbę fragmentów w Twoim stosie):
Wreszcie, możesz znaleźć dowolny ze swoich fragmentów w swoim backstacku za pomocą tej metody:
Dlatego pobranie górnego fragmentu w swoim backstacku można łatwo osiągnąć, wywołując:
Mam nadzieję że to pomoże!
źródło
ta metoda pomocnicza pobiera fragment ze szczytu stosu:
źródło
Kotlin
źródło
.lastOrNull()
w przypadku, gdyfragments
jest pusty.W pliku fragmentMananger znajduje się lista fragmentów. Należy pamiętać, że usunięcie fragmentu nie powoduje zmniejszenia rozmiaru listy (wpis fragmentu po prostu zmienia się na null). Dlatego poprawnym rozwiązaniem byłoby:
źródło
getFragments()
zwraca skróconą kolekcję fragmentów. Może ostatni jest widoczny, ale niewiele innych.Odpowiedź udzielona przez deepak goel nie działa dla mnie, ponieważ zawsze otrzymuję zero
entry.getName()
;To, co robię, to ustawiam Tag do fragmentu w ten sposób:
Gdzie ft to moja transakcja fragmentowa, a
FRAGMENT_TAG
to tag. Następnie używam tego kodu, aby uzyskać fragment:źródło
Właśnie wziąłem @roghayeh hosseini (poprawną) odpowiedź i zrobiłem to w Kotlinie dla tych tutaj w 2017 :)
* Należy to wywołać z wnętrza działania.
Cieszyć się :)
źródło
możesz użyć getBackStackEntryAt () . Aby dowiedzieć się, ile wpisów utrzymuje aktywność w backstacku, możesz użyć metody getBackStackEntryCount ()
źródło
Dodam coś do odpowiedzi Deepak Goel, ponieważ wiele osób, w tym ja, otrzymywało wartość zerową, używając jego metody. Najwyraźniej aby tag działał po dodaniu fragmentu do stosu, powinieneś to zrobić w ten sposób:
Musisz dwukrotnie dodać ten sam tag.
Skomentowałbym, ale nie mam 50 reputacji.
źródło
Zachować swoją tylną stos:
myBackStack
. JakoAdd
fragment do plikuFragmentManager
, dodaj go również domyBackStack
. WonBackStackChanged()
pop odmyBackStack
kiedy jego długość jest większa niżgetBackStackEntryCount
.źródło
Wygląda na to, że coś się zmieniło na lepsze, ponieważ poniższy kod u mnie działa idealnie, ale nie znalazłem go w udzielonych już odpowiedziach.
Kotlin:
Jawa:
źródło
Jeśli używasz
addToBackStack()
, możesz użyć następującego kodu.List<Fragment> fragments = fragmentManager.getFragments(); activeFragment = fragments.get(fragments.size() - 1);
źródło
Właściwie nie ma żadnego najnowszego fragmentu dodanego do stosu, ponieważ możesz dodać kilka lub fragmenty do stosu w jednej transakcji lub po prostu usunąć fragmenty bez dodawania nowego.
Jeśli naprawdę chcesz mieć stos fragmentów i mieć dostęp do fragmentu przez jego indeks w stosie, lepiej mieć warstwę abstrakcji nad
FragmentManager
i jego backstackiem. Oto jak możesz to zrobić:Teraz zamiast dodawania i usuwania fragmentów dzwoniąc
FragmentManager
bezpośrednio, należy użyćpush()
,replace()
ipop()
metodyFragmentStackManager
. I będziesz mógł uzyskać dostęp do najwyższego fragmentu, po prostu dzwoniącstack.get(stack.size() - 1)
.Ale jeśli lubisz hacki, mam inne sposoby na robienie podobnych rzeczy. Jedyne, o czym muszę wspomnieć, to to, że te hacki będą działać tylko z fragmentami wsparcia.
Pierwszy hack polega na dodaniu wszystkich aktywnych fragmentów do menedżera fragmentów. Jeśli po prostu zastąpisz fragmenty jeden po drugim i zdejmiesz ze stosu, ta metoda zwróci najwyższy fragment:
Drugie podejście jest bardziej hakerskie i pozwala na pobranie wszystkich fragmentów dodanych w ostatniej transakcji, dla której
addToBackStack
wywołano:Zauważ, że w tym przypadku musisz umieścić tę klasę w
android.support.v4.app
pakiecie.źródło
Lub możesz po prostu dodać tag podczas dodawania fragmentów odpowiadających ich zawartości i użyć prostego statycznego pola String (możesz również zapisać go w pakiecie instancji działania w metodzie onSaveInstanceState (Bundle)), aby przechowywać ostatnio dodany znacznik fragmentu i pobrać ten fragment przezTag () w dowolnym momencie ...
źródło
Najwyższa odpowiedź (Deepak Goel) nie działała dobrze dla mnie. W jakiś sposób tag nie został poprawnie dodany.
Skończyło się na tym, że wysłałem ID fragmentu przez przepływ (używając intencji) i pobrałem go bezpośrednio z menedżera fragmentów.
źródło