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!
android
android-fragments
Robert Karl
fonte
fonte
Respostas:
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.
fonte
hide()
eshow()
economizar nisso! Obrigado por isso!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çahide()
.fonte
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
fonte