No meu main.xml
eu tenho
<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>
E eu estou definindo um objeto de fragmento como este
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new FragmentType1();
fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag");
// fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Ele está definindo diferentes tipos de objetos Fragment ( FragmentType2,FragmentType3,...
) em momentos diferentes. Agora, em algum momento, preciso identificar qual objeto está atualmente lá.
Em resumo , preciso fazer algo assim:
Fragment currentFragment = //what is the way to get current fragment object in FrameLayout R.id.frameTitle
Eu tentei o seguinte
TitleFragment titleFragmentById = (TitleFragment) fragmentManager.findFragmentById(R.id.frameTitle);
e
TitleFragment titleFragmentByTag = (TitleFragment) fragmentManager.findFragmentByTag("fragmentTag");
Mas ambos os objetos (titleFragmentById e titleFragmentByTag) são Perdinull
alguma coisa?
Estou usando Compatibility Package, r3
e desenvolvendo para API level 7
.
findFragmentById()
e findFragmentByTag()
funcionará se tivermos definido o fragmento usando fragmentTransaction.replace
or fragmentTransaction.add
, mas funcionará return null
se tivermos definido o objeto em xml (como o que fiz no meu main.xml
). Acho que estou perdendo alguma coisa nos meus arquivos XML.
fonte
Respostas:
Chamada
findFragmentById()
emFragmentManager
e determinar quais fragmento está na suaR.id.frameTitle
embalagem.fonte
fragmentTransaction.replac
e ou,fragmentTransaction.add
mas não será possível se o tivermos definido como xml. Veja minha edição 2findFragmentByTag
retornando nulo no caso deActionBar
Guias. No meuActivity
que está se estendendo,ActionBarActivity
estou adicionando abasActionBar
e depois localizando-a!executePendingTransactions()
emFragmentManager
depois de chamarcommit()
a transação, embora eu não tentei isso. Ou você pode usarsetContentView()
para usar um arquivo de layout com uma<fragment>
tag. Um desses eventos ocorre de forma síncrona e, portanto, o fragmento existirá naonCreate()
própria chamada em que você usouexecutePendingTransaction()
ousetContentView()
. Caso contrário, um comumFragmentTransaction
é processado de forma assíncrona e nem começará noonCreate()
final do tempo .Tente isso,
isso lhe dará o fragmento atual, então você poderá compará-lo à classe de fragmentos e fazer seus materiais.
fonte
getSupportFragmentManager()
em vez disso, e vai ficar nula sem asupport
parteEu acho que você pode usar o evento onAttachFragment pode ser útil para capturar qual fragmento está ativo.
fonte
Eu acho que você deveria fazer:
O motivo é porque você definiu a tag "fragmentTag" como o último fragmento que você adicionou (ao chamar substituir).
fonte
fragmentTransaction.replac
e ou,fragmentTransaction.add
mas não será possível se o tivermos definido como xml. Veja minha edição 2fragmentTag
é a tag do fragmento atual?Você pode obter a lista dos fragmentos e procurar o último.
Mas, às vezes (quando você navega para trás), o tamanho da lista permanece o mesmo, mas alguns dos últimos elementos são nulos. Portanto, na lista, iteramos o último fragmento não nulo e o usei.
fonte
getFragments()
método Ele está marcado com@hide
e não deveria ser incluído no jar da biblioteca de suporte. Não deve ser considerado como parte da API exportada.getFragments()
faz, porque você precisa com bastante frequência. Eu acho que também está disponível publicamente agora.Esta é a solução mais simples e funciona para mim.
1.) você adiciona seu fragmento
2.)
fonte
Pode ser tarde, mas espero que ajude outra pessoa, também o @CommonsWare postou a resposta correta.
fonte
Talvez a maneira mais simples seja:
Funcionou para mim
fonte
Você pode criar um campo na sua Classe de atividade pai:
E então dentro de cada classe de fragmento:
Seu campo 'fr' é o fragmento atual Object
Também está trabalhando com popBackStack ()
fonte
Eu sei que já faz um tempo, mas eu vou fazer isso aqui, caso isso ajude alguém.
A resposta certa de longe é (e a selecionada) a resposta do CommonsWare. Eu estava tendo o mesmo problema que o postado, o seguinte
continuou retornando nulo. Meu erro foi muito bobo, no meu arquivo xml:
O erro foi que eu tinha android: tag INSTEAD OF android: id .
fonte
A resposta do @Hammer funcionou para mim, estou usando para controlar um botão de ação flutuante
fonte
Se você estiver estendendo a partir de AbstractActivity, poderá usar o método getFragments ():
fonte
Se você estiver definindo o fragmento na camada XML da atividade,
Activity
certifique-se de ligarsetContentView()
antes de ligarfindFragmentById()
.fonte
Se você estiver usando o BackStack ... e SOMENTE se você estiver usando a pilha traseira, tente o seguinte:
fonte
Isso fornecerá o nome atual da classe de fragmento ->
fonte
Faça uma verificação (que fragmento no contêiner de atividade) no método onStart;
Alguns conferem:
fonte