Fragmentos do Android: quando usar ocultar / mostrar ou adicionar / remover / substituir?

117

Suponha que eu deseje substituir o fragmento atual em alguma visualização de contêiner por outro. É melhor usar substituir ...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

... ou o seguinte, com mostrar e ocultar?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

Existe uma maneira de fazer isso mais eficiente? Não consigo encontrar muitas informações sobre quando usar esses métodos ou como eles afetam o ciclo de vida dos fragmentos envolvidos. Obrigado!

Robert Karl
fonte
Se eu for para o fragmento B do fragmento A e depois voltar para o fragmento A, como posso ter certeza de que o evento do ciclo de vida, como onCreateView, não é chamado no fragmento A? Encontrar fragmento por tag funciona?
blackHawk

Respostas:

135

Você deve considerar o que planeja fazer com o fragmento para decidir qual caminho seguir. Se você usar uma FragmentTransaction para ocultar o fragmento, ele ainda pode estar no estado de execução de seu ciclo de vida, mas sua IU foi separada da janela, portanto não está mais visível. Portanto, você ainda pode tecnicamente interagir com o fragmento e reconectar sua IU posteriormente, se necessário. Se você substituir o fragmento, você está realmente puxando-o para fora do contêiner e ele passará por todos os eventos de desmontagem no ciclo de vida (onPause, onStop, etc) e se por algum motivo você precisar desse fragmento novamente, você terá que insira-o de volta no contêiner e deixe-o passar por toda a inicialização novamente.

Se houver uma grande probabilidade de que você precisará desse fragmento novamente, apenas oculte-o porque é uma operação menos dispendiosa redesenhar seu layout do que reinicializá-lo completamente.

David C. Sainte-Claire
fonte
5
Para nossas necessidades, inicializar o fragmento é muito caro, então provavelmente vamos prosseguir hide()e show()economizar nisso! Obrigado por isso!
Robert Karl
2
Olá, quando você diz desconectar da janela, quer dizer que o retorno de chamada onDetach () será chamado? Eu experimentei isso, parece que não é o caso.
GingerJim
provavelmente ele quis dizer "separar"; um fragmento também pode ser desanexado / reanexado (adicionalmente para adicionar / remover, mostrar / ocultar)
comeGetSome
1
@Zainodis, também tenho o mesmo problema. Minha solução é salvar o estado oculto do fragmento em onSaveInstanceState () - savedInstanceState.putBoolean (STATE_HIDDEN, isHidden ()); então em onCreate () if (savedInstanceState! = null) obtém o estado oculto de volta e se o fragmento estiver oculto, oculte-o com a transação.
worawee.s
1
@ worawee.s Olá e obrigado pela atualização :)! Resolvi o problema há um tempo - eu realmente não precisava ocultar / mostrar etc., então abandonei completamente e agora estou indo com padrões como adicionar / substituir ou atividades de fragmento único em painel único (fluxo de detalhes mestre basicamente) . Para aqueles que ainda usam ocultar, sua solução será muito útil - e não verificar savedInstance! = Null foi um dos erros que cometi antes.
AgentKnopf
5

Você basicamente respondeu a si mesmo. Se você quiser substituir (para que o fragmento antigo não seja mais necessário), use replace()se quiser ocultá-lo temporariamente, então faça hide().

Marcin Orlowski
fonte
Basicamente, substituir removeAll. Não consegui encontrar o hideAll correspondente :(
AlikElzin-kilaka,
@ AlikElzin-kilaka No meu fragmento de atividade 3 em todos os três fragmentos eu busco dados da rede qual método devo seguir
Mansukh Ahir
0

Eu usei o método ocultar / mostrar em minha atividade com 4 fragmentos e resolveu minha solução, mas algum tempo aleatoriamente quando eu mostro minha caixa de diálogo, ele dá a janela exceção de token incorreto quando usei o método de adição e substituição, então a exceção de token ruim não ocorre, então eu acho que mostra / método de esconder não é perfeito

Dishant Kawatra
fonte