Como posso obter a última instância do fragmento adicionada ao backstack (se não souber a tag e a id do fragmento)?
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
fonte
fonte
FragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
ouFragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
docstack
se não consigo acessar o fragmento por meio de um método pop?função retorna link para o topo
Fragment
na pilha de retorno. Exemplo de uso:fonte
Eu tentei pessoalmente muitas dessas soluções e acabei com esta solução de trabalho:
Adicione este método de utilitário que será usado várias vezes abaixo para obter o número de fragmentos em sua pilha de retorno:
Então, quando você adicionar / substituir seu fragmento usando o método FragmentTransaction, gere uma tag única para o seu fragmento (por exemplo: usando o número de fragmentos em sua pilha):
Finalmente, você pode encontrar qualquer um dos seus fragmentos em sua pilha de retorno com este método:
Portanto, buscar o fragmento superior em sua pilha pode ser facilmente alcançado chamando:
Espero que isto ajude!
fonte
este método auxiliar obtém o fragmento do topo da pilha:
fonte
Kotlin
fonte
.lastOrNull()
casofragments
esteja vazio.Há uma lista de fragmentos no fragmentMananger. Esteja ciente de que remover um fragmento não diminui o tamanho da lista (a entrada do fragmento apenas se torna nula). Portanto, uma solução válida seria:
fonte
getFragments()
retorna uma coleção reduzida de fragmentos. Talvez o último esteja visível, mas não muitos outros.A resposta dada por deepak goel não funciona para mim porque sempre fico nulo com
entry.getName()
;O que faço é definir uma tag para o fragmento desta forma:
Onde ft é minha transação de fragmento e
FRAGMENT_TAG
é a tag. Então eu uso este código para obter o fragmento:fonte
Peguei a resposta @roghayeh hosseini (correta) e fiz em Kotlin para quem está aqui em 2017 :)
* Deve ser chamado de dentro de uma Activity.
Aproveitar :)
fonte
você pode usar getBackStackEntryAt () . Para saber quantas entradas a atividade contém na pilha de retorno, você pode usar getBackStackEntryCount ()
fonte
Acrescentarei algo à resposta de Deepak Goel, já que muitas pessoas, inclusive eu, estavam obtendo um valor nulo usando seu método. Aparentemente, para fazer a tag funcionar quando você adiciona um fragmento à pilha de apoio, você deve fazer assim:
Você precisa adicionar a mesma tag duas vezes.
Eu teria comentado, mas não tenho 50 reputação.
fonte
Manter sua própria pilha de volta:
myBackStack
. Ao adicionarAdd
um fragmento aoFragmentManager
, adicione- o tambémmyBackStack
. NoonBackStackChanged()
pop, a partir demyBackStack
quando seu comprimento é maior quegetBackStackEntryCount
.fonte
Parece que algo mudou para melhor, porque o código abaixo funciona perfeitamente para mim, mas não o encontrei nas respostas já fornecidas.
Kotlin:
Java:
fonte
Se você usar
addToBackStack()
, você pode usar o seguinte código.List<Fragment> fragments = fragmentManager.getFragments(); activeFragment = fragments.get(fragments.size() - 1);
fonte
Na verdade, não há fragmento mais recente adicionado à pilha porque você pode adicionar vários ou fragmentos à pilha em uma única transação ou simplesmente remover fragmentos sem adicionar um novo.
Se você realmente deseja ter uma pilha de fragmentos e ser capaz de acessar um fragmento por seu índice na pilha, é melhor ter uma camada de abstração sobre o
FragmentManager
e seu backstack. Veja como você pode fazer isso:Agora, em vez de adicionar e remover fragmentos chamando
FragmentManager
diretamente, você deve usarpush()
,replace()
epop()
métodos deFragmentStackManager
. E você poderá acessar o fragmento superior apenas chamandostack.get(stack.size() - 1)
.Mas se você gosta de hacks, tenho outras maneiras de fazer coisas semelhantes. A única coisa que devo mencionar é que esses hacks funcionarão apenas com fragmentos de suporte.
O primeiro hack é apenas adicionar todos os fragmentos ativos ao gerenciador de fragmentos. Se você apenas substituir os fragmentos um por um e retirá-los da pilha, este método retornará o fragmento superior:
A segunda abordagem é o evento mais hacky e permite que você obtenha todos os fragmentos adicionados na última transação para a qual
addToBackStack
foi chamado:Observe que, neste caso, você deve colocar esta classe no
android.support.v4.app
pacote.fonte
Ou você pode apenas adicionar uma tag ao adicionar fragmentos correspondentes ao seu conteúdo e usar o campo String estático simples (você também pode salvá-lo no pacote de instância de atividade no método onSaveInstanceState (Bundle)) para manter a última tag de fragmento adicionada e obter este fragmento porTag () a qualquer hora que você precisar ...
fonte
A resposta mais alta (Deepak Goel) não funcionou bem para mim. De alguma forma, a tag não foi adicionada corretamente.
Acabei apenas enviando o ID do fragmento através do fluxo (usando intents) e recuperando-o diretamente do gerenciador de fragmentos.
fonte