Estoy usando el siguiente método para cambiar entre Fragmentos (en mi NavigationDrawer) mostrándolos / ocultándolos.
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;
}
Lo que no tengo claro es qué método del ciclo de vida de Fragmentos se llama cuando lo muestro u oculto. (dado que no hay un método como onShow () o onHide (), no estoy muy seguro de qué usar). Quiero realizar acciones específicas al mostrar y ocultar un determinado Fragmento.
android
android-fragments
lifecycle
fragmenttransaction
Philipp Jahoda
fuente
fuente
onCreate()
, seguido deonCreateDialog()
, seguido deonCreateView()
Respuestas:
Similar al ciclo de vida de la actividad, Android llama a onStart () cuando el fragmento se vuelve visible.
onStop()
normalmente se llama cuando el fragmento se vuelve invisible, pero también se puede llamar más adelante en el tiempo.Dependiendo de su diseño, Android puede llamar
onStart()
incluso, cuando su Fragmento aún no está visible, pero pertenece a un contenedor principal visible. Por ejemplo, esto es válido para loandroid.support.v4.view.ViewPager
que requiere que anule elFragment.setUserVisibleHint()
método. En cualquier caso, si necesita registrar / anular el registro de BroadcastReceivers u otros oyentes, puede usar los métodosonStart()
y de forma seguraonStop()
porque siempre se llamarán.Nota: Algunos contenedores de fragmentos pueden mantener iniciados los fragmentos invisibles. Para manejar esta situación, puede anular
Fragment.onHiddenChanged(boolean hidden)
. Según la documentación , un fragmento debe estar tanto iniciado como visible (no oculto) para que sea visible para el usuario.Actualización: si lo usa
android.support.v4.widget.DrawerLayout
, un fragmento debajo del cajón permanece encendido y visible incluso cuando el cajón está abierto. En este caso, debe usarDrawerLayout.setDrawerListener()
y escucharonDrawerClosed()
yonDrawerOpened()
devoluciones de llamada.fuente
onStop
yonPause
no se llaman cuando un fragmento se vuelve invisible mediante una transacción. Sin embargo,onHiddenChanged
se llama como sugiere la respuesta s1riusYo @Anulo este método y resuelvo mi problema:
fuente
setUserVisibleHint
como se muestra en stackoverflow.com/a/18375436/1815624 funcionapor supuesto, puede @Override el siguiente método para hacerlo:
fuente
getUserVisibleHint()
Fragmento en el comportamiento del localizador de vista es diferente con el contenedor de fragmentos normal.
Prueba este código:
fuente
Prueba este código:
fuente
Puede usar 'onCreateView' (o 'onActivityCreated') y 'onHiddenChanged'. Use 'onCreateView' para la primera presentación y use 'onHiddenChanged' para más tarde. 'setMenuVisibility' no se llama en el control de transacciones.
fuente
Solo prueba esto en tu setUserVisibleHint ()
Y crea este código en onCreateView () :
fuente
isVisibleToUser && getView() != null
funcionó perfecto para mí!// primero que nada creas una interfaz
// Después de eso, esta interfaz se implementa dentro de Fragment así
// Ahora va su actividad, luego crea un objeto de interfaz y llama adentro cuando addOnViewpagerListener
fuente
setUserVisibleHint
llamar antesonCreateView
. y no puede actualizar ninguna Vista dentro de setUserVisibleHint que usopara visibilidad y onHiddenChanged () no llamó por primera vez . llama cuando cambia el estado oculto. porque a
fragment is visible by default
. Para lograr este método por primera vez, debe llamar ymFragmentTransaction.hide(oldFragment)
luego funcionaráNota
si desea usar la sugerencia setUserVisible y actualizar la vista Use este método
fuente
Por supuesto, puede anular
setUserVisibleHint
o,setMenuVisibility
pero si necesita acceder aContext
oActivity
, ¡serán nulos allí! Hay otro metodoonStart
que siempre tiene el contexto disponible a mano, pero solo se llamará una vez después de la creación del fragmento y si comienza a moverse entre sus fragmentos en un buscapersonas, verá que no se llamará en la segunda vista y luego .Entonces ... ¿qué hacer ahora?
La solución es bastante fácil, utilícela
onStart
para la primera visita ysetMenuVisibility
para las posteriores. Su código probablemente se verá como a continuación:Clase de fragmento:
De esta forma
Context
siempre estará disponible para eldoSth()
método.fuente
¡Solo esto funcionó para mí! y
setUserVisibleHint(...)
ahora está en desuso (adjunté documentos al final), lo que significa que algunas otras respuestas están en desuso ;-)Probado y también funciona
NaviagationDrawer
,isMenuVisible()
siempre volverátrue
(yonResume()
parece suficiente, pero también queremos apoyarViewPager
).fuente