Estou usando o seguinte método para alternar entre Fragments (em meu NavigationDrawer), mostrando / ocultando-os.
protected void showFragment(int container, Fragment fragment, String tag, String lastTag, boolean addToBackStack ) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
if ( lastTag != null && !lastTag.equals("")) {
Fragment lastFragment = fragmentManager.findFragmentByTag( lastTag );
if ( lastFragment != null ) {
transaction.hide( lastFragment );
}
}
if ( fragment.isAdded() ) {
transaction.show( fragment );
}
else {
transaction.add( container, fragment, tag );
}
if ( addToBackStack ) {
transaction.addToBackStack( tag );
}
transaction.commit();
// set the active tag
activeFragTag = tag;
}
O que não estou certo é qual método do ciclo de vida do Fragments é chamado quando eu o mostro ou oculto? (uma vez que não há nenhum método como onShow () ou onHide (), não tenho certeza do que usar). Quero realizar ações específicas ao mostrar e ocultar um determinado fragmento.
android
android-fragments
lifecycle
fragmenttransaction
Philipp Jahoda
fonte
fonte
onCreate()
, seguido poronCreateDialog()
, seguido poronCreateView()
Respostas:
Semelhante ao ciclo de vida da atividade, o Android chama onStart () quando o fragmento se torna visível.
onStop()
normalmente é chamado quando o fragmento se torna invisível, mas também pode ser chamado posteriormente.Dependendo de seu layout, o Android pode chamar
onStart()
even, quando seu Fragment ainda não está visível, mas pertence a um contêiner pai visível. Por exemplo, isso é válido para oandroid.support.v4.view.ViewPager
que requer que você substitua oFragment.setUserVisibleHint()
método. Em qualquer caso, se você precisar registrar / cancelar o registro de BroadcastReceivers ou outros ouvintes, você pode usar os métodosonStart()
e com segurançaonStop()
porque eles serão sempre chamados.Nota: Alguns contêineres de fragmentos podem manter fragmentos invisíveis iniciados. Para lidar com essa situação, você pode substituir
Fragment.onHiddenChanged(boolean hidden)
. De acordo com a documentação , um fragmento deve ser iniciado e visível (não oculto) , para ser visível ao usuário.Atualização: Se você usar
android.support.v4.widget.DrawerLayout
, um fragmento abaixo da gaveta permanece aberto e visível mesmo quando a gaveta está aberta. Nesse caso, você precisa usarDrawerLayout.setDrawerListener()
e ouvironDrawerClosed()
eonDrawerOpened()
callbacks.fonte
onStop
eonPause
não são chamados quando um fragmento se torna invisível por meio de uma transação. No entanto,onHiddenChanged
é chamado como sugere resposta s1riusEu @subro este método e resolvo meu problema:
fonte
setUserVisibleHint
conforme mostrado em stackoverflow.com/a/18375436/1815624 funcionaé claro que você pode substituir o seguinte método para fazer isso:
fonte
getUserVisibleHint()
O comportamento do fragmento no pager de visualização é diferente com o contêiner de fragmento regular.
Experimente este código:
fonte
Experimente este código:
fonte
Você pode usar 'onCreateView' (ou 'onActivityCreated') e 'onHiddenChanged'. Use 'onCreateView' para o primeiro show e use 'onHiddenChanged' para depois. 'setMenuVisibility' não é chamado no controle de transação.
fonte
Apenas tente isso em seu setUserVisibleHint ()
E crie este código em onCreateView () :
fonte
isVisibleToUser && getView() != null
funcionou perfeito para mim!// antes de mais nada, você cria uma interface
// Depois disso, esta interface implementa dentro do Fragment assim
// Agora vai sua Activity, então cria o objeto da interface e chama dentro quando addOnViewpagerListener
fonte
setUserVisibleHint
ligue antesonCreateView
. e você não pode atualizar qualquer View dentro de setUserVisibleHint que eu usopara visibilidade e onHiddenChanged () não chamaram pela primeira vez . ele chama quando o estado oculto muda. porque um
fragment is visible by default
. Para atingir este método pela primeira vez, você deve chamar,mFragmentTransaction.hide(oldFragment)
então ele funcionaráNota
se você quiser usar a dica setUserVisible e atualizar o modo de exibição Use este método
fonte
Claro que você pode substituir
setUserVisibleHint
ou,setMenuVisibility
mas se você precisar acessarContext
ouActivity
, eles serão nulos lá! Existe outro métodoonStart
que sempre tem o contexto disponível, mas ele só será chamado uma vez na criação do fragmento e se você começar a se mover entre seus fragmentos em um pager verá que ele não será chamado na segunda visualização e depois .Então o que fazer agora?
A solução é bastante fácil, use
onStart
na primeira visita esetMenuVisibility
nas posteriores. Seu código provavelmente será assim:Classe de fragmento:
Desta forma,
Context
estará sempre disponível para odoSth()
método.fonte
Só isso funcionou para mim !! e
setUserVisibleHint(...)
agora está obsoleto (anexei os documentos no final), o que significa que algumas outras respostas estão obsoletas ;-)Testado e funciona
NaviagationDrawer
bem,isMenuVisible()
sempre haverá retornotrue
(eonResume()
parece suficiente, mas queremos apoiarViewPager
também).fonte