Estou brincando com fragmentos no Android.
Eu sei que posso alterar um fragmento usando o seguinte código:
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();
Minha pergunta é, em um arquivo Java, como posso obter a instância do Fragment exibida no momento?
Respostas:
Ao adicionar o fragmento em sua transação, você deve usar uma tag.
... e mais tarde, se você quiser verificar se o fragmento está visível:
Consulte também http://developer.android.com/reference/android/app/Fragment.html
fonte
Eu sei que é um post antigo, mas também estava tendo problemas com ele anteriormente. Encontrei uma solução para fazer isso na
onBackStackChanged()
função de escutaIsso funcionou para mim, pois não queria percorrer todos os fragmentos que tenho para encontrar um que seja visível. Espero que ajude outra pessoa também.
fonte
.getFragmentManager
relatórios tipo incompatível, como aconteceu no meu caso, é porque eu estava usando oandroid.support.app.v4.Fragment
, caso em que o método direito de uso égetSupportFragmentManager
findFragmentByTag()
no lugar defindFragmentById
, se você tiver fornecido tag se fragmentar ao adicioná-lo afragmentManager.beginTransaction() .add(containerID, frag, fragmentTag) .addToBackStack(fragmentTag) .commit();
Aqui está minha solução que eu acho útil para cenários de baixo fragmento
fonte
fragment
pode ser nulo em certos cenários, como quando você abre a pilha traseira. Tão melhor usoif (fragment != null && fragment.isVisible())
.Toda vez que você mostra um fragmento, deve colocá-lo no backstack:
E então, quando você precisar obter o fragmento atual, poderá usar este método:
fonte
addToBackStack(tag)
, mas e se você não quiser adicionar o fragmento à pilha de trás?O que estou usando para encontrar o fragmento de exibição atual está no código abaixo. É simples e funciona para mim agora. É executado na atividade que contém os fragmentos
fonte
fragManager.getFragments().size()
vez de,getBackStackEntryCount()
pois eles não são necessariamente iguais (que é o meu caso). Caso contrário, você pode travar com IndexOutOfBoundsExceptionManeira Kotlin;
fonte
getFragments()
função frameworks , que é API 26 e superior.A maneira reativa :
fonte
Meu método é baseado em try / catch assim:
Mas pode haver uma maneira melhor ...
fonte
Bem, essa pergunta teve muitas visualizações e atenção, mas ainda não continha a solução mais fácil do meu lado - usar getFragments ().
fonte
getSupportFragmentManager().getFragments()
retorna uma lista, mas que pode conter valores nulos, se o fragmento mais recente acabou de ser retirado do backstack. Eq: Se você verificar o seu caminho dentro doonBackStackChanged()
método e ligar parapopBackStack()
algum lugar, entãomCurrentFragment
seránull
.Você pode consultar qual fragmento é carregado no seu quadro de conteúdo de Atividades e recuperar a classe de fragmento ou o 'nome simples' do fragmento (como uma sequência).
Uso:
Saídas:
fonte
É um pouco tarde, mas para quem estiver interessado: Se você conhece o índice do fragmento desejado no FragmentManager, obtenha uma referência a ele e verifique a função isMenuVisible ()! aqui :
Se
true
é visível para o usuário e assim por diante!fonte
isVisible() == true
,getView() != null
. Além disso, no meu códigogetBackStackEntryCount
é sempre zero. Mesmo que eu não use menus,isMenuVisible()
até agora é o único discriminante que parece apontar de maneira confiável para o fragmento atualmente "ativo". ty1)
2)
3)
fonte
Se chegar aqui e você estiver usando o Kotlin:
R.id.fragment_container
é o localid
ondefragment
está apresentando em seuactivity
Ou se você deseja uma solução melhor:
fonte
Inspirado pela resposta de Tainy , aqui estão meus dois centavos. Pouco modificado da maioria das outras implementações.
Substitua
"myActivity"
por "this" se for sua atividade atual ou use referência a sua atividade.fonte
Há um método chamado
findFragmentById()
noSupportFragmentManager
. Eu o uso no contêiner de atividades como:É assim que você se atualiza
Fragment
. Se você tem um costumeFragment
e precisa verificar oFragment
que é, normalmente usoinstanceof
:fonte
Se você estiver usando o
AndroidX Navigation
:Para mais informações sobre este componente de navegação: https://developer.android.com/guide/navigation/navigation-getting-started
fonte
your_navhost
.Esta é uma maneira simples de obter o fragmento atual.
fonte
A resposta de Sev funciona quando você pressiona o botão Voltar ou altera o backstack.
Eu fiz algo um pouco diferente, no entanto. Eu tenho uma configuração de ouvinte de alteração de backstack em um fragmento base e seus fragmentos derivados e esse código está no ouvinte:
fonte
Isso é trabalho para mim. Espero que isso ajude alguém.
fonte
Se você estiver obtendo a instância atual do Fragment da atividade pai, poderá apenas
Na verdade, essa é a instância atual do fragmento que é preenchida na exibição. Eu tive o mesmo problema. Eu tive que carregar o mesmo fragmento duas vezes, mantendo um no backstack.
O método a seguir não funciona. Apenas obtém um fragmento com a etiqueta. Não perca seu tempo com esse método. Estou certo de que tem seus usos, mas obter a versão mais recente do mesmo fragmento não é um deles.
fonte
Finalize esta solução. Funcionou para mim obter o fragmento atual.
fonte
fonte
Bem, acho que essa é a resposta mais direta a essa pergunta. Eu espero que isso ajude.
fonte
Aqui está uma solução Kotlin:
Maneira simplificada:
fonte
Maneira fácil de fazer isso:
fonte
Na atividade principal, o método onAttachFragment (fragmento de fragmento) é chamado quando um novo fragmento é anexado à atividade. Nesse método, você pode obter a instância do fragmento atual. No entanto, o método onAttachFragment não é chamado quando um fragmento é retirado do backstack, ou seja, quando o botão Voltar é pressionado para colocar o fragmento superior no topo da pilha. Ainda estou procurando um método de retorno de chamada que é acionado na atividade principal quando um fragmento se torna visível dentro da atividade.
fonte
No caso de fragmentos rolados, quando sua instância de uso da classe ViewPager, suponha mVeiwPager, você pode chamar mViewPager.getCurrentItem () para obter o número int do fragmento atual.
em MainLayout.xml
em MainActivity.kt
fonte
Eu achei
findFragmentByTag
que não é tão conveniente. Se você possui um dosString currentFragmentTag
seusActivity
paisFragment
, é necessário salvá-loonSaveInstanceState
e restaurá-loonCreate
. Mesmo se você fizer isso, quando oActivity
recriadoonAttachFragment
for chamado antesonCreate
, você não poderá usácurrentFragmentTag
-loonAttachFragment
(por exemplo, atualizar algumas visualizações com base emcurrentFragmentTag
), porque talvez ainda não seja restaurado.Eu uso o seguinte código:
O documento de
FragmentManager
estado queQuando você precisar fazer coisas com base no tipo de fragmento atual, use em
getCurrentFragment() instance of MyFragment
vez decurrentFragmentTag.equals("my_fragment_tag")
.Observe que
getCurrentFragment()
inonAttachFragment
não receberá o anexoFragment
, mas o anterior anexado.fonte
Eu tive que fazer isso muito recentemente e nenhuma das respostas aqui realmente se adequava a esse cenário.
Se você tem certeza de que apenas um fragmento será visível (tela cheia), realmente deseja encontrar o que está no topo do backstack. Por exemplo, como um
Kotlin
paraFragment
:E use-o como:
fonte
Você pode fazer isso com muita facilidade também com uma URL no logcat que o redirecionará para o código-fonte do código-fonte atual do fragmento. Primeiro, você precisa adicionar um OnBackStackChangedListener na atividade do host, como -
E a implementação OnBackStackChangedListener é -
E o método getStackTopName () é -
fonte