Estoy jugando con fragmentos en Android.
Sé que puedo cambiar un fragmento usando el siguiente código:
FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();
MyFragment myFragment = new MyFragment(); //my custom fragment
fragTrans.replace(android.R.id.content, myFragment);
fragTrans.addToBackStack(null);
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();
Mi pregunta es, en un archivo Java, ¿cómo puedo obtener la instancia de Fragment que se muestra actualmente?
Respuestas:
Cuando agrega el fragmento en su transacción, debe usar una etiqueta.
... y luego si quieres comprobar si el fragmento es visible:
Ver también http://developer.android.com/reference/android/app/Fragment.html
fuente
Sé que es una publicación antigua, pero también tuve problemas con ella anteriormente. Encontré una solución que era hacer esto en la
onBackStackChanged()
función de escuchaEsto funcionó para mí, ya que no quería recorrer cada fragmento que tengo para encontrar uno que sea visible. Espero que ayude a alguien más también.
fuente
.getFragmentManager
informes de tipo incompatible, como lo hizo en mi caso, es porque estaba usando elandroid.support.app.v4.Fragment
, en cuyo caso el método correcto para usar esgetSupportFragmentManager
findFragmentByTag()
en lugar defindFragmentById
, si ha proporcionado una etiqueta para fragmentar al agregarla afragmentManager.beginTransaction() .add(containerID, frag, fragmentTag) .addToBackStack(fragmentTag) .commit();
Aquí está mi solución, que encuentro útil para escenarios de bajo fragmento
fuente
fragment
puede ser nulo en ciertos escenarios, como cuando hace estallar la pila posterior. Así que mejor usoif (fragment != null && fragment.isVisible())
.Cada vez que muestres un fragmento debes poner la etiqueta en la pila:
Y luego, cuando necesite obtener un fragmento actual, puede usar este método:
fuente
addToBackStack(tag)
, pero ¿qué pasa si no quieres agregar el fragmento a la pila posterior?Lo que estoy usando para encontrar el fragmento de visualización actual se encuentra en el siguiente código. Es simple y funciona para mí por ahora. Se ejecuta en la actividad que contiene los fragmentos.
fuente
fragManager.getFragments().size()
lugar de,getBackStackEntryCount()
ya que no son necesariamente iguales (que es mi caso). De lo contrario, puede bloquearse con IndexOutOfBoundsExceptionCamino de Kotlin;
fuente
getFragments()
función frameworks , que es API 26 y superior.La forma reactiva :
fuente
Mi método se basa en try / catch de esta manera:
Pero puede haber una mejor manera ...
fuente
Bueno, esta pregunta obtuvo muchas opiniones y atención, pero aún no contenía la solución más fácil de mi parte: usar getFragments ().
fuente
getSupportFragmentManager().getFragments()
le devuelve una lista, pero puede contener valores nulos, si el último fragmento acaba de salir de la pila. Eq: si verifica con su método internoonBackStackChanged()
y llama apopBackStack()
algún lugar, entoncesmCurrentFragment
seránull
.Puede consultar qué fragmento se carga en su marco de contenido de Actividades y recuperar la clase de fragmento o el fragmento 'nombre simple' (como una cadena).
Uso:
Salidas:
fuente
Es un poco tarde, pero para cualquiera que esté interesado: si conoce el índice del fragmento que desea en FragmentManager, solo obtenga una referencia y verifique la función isMenuVisible (). aquí :
Si es
true
visible para el usuario, etc.fuente
isVisible() == true
,getView() != null
. Además, en mi códigogetBackStackEntryCount
siempre es cero. Aunque no uso los menús,isMenuVisible()
hasta ahora es el único discriminante que parece apuntar de manera confiable al fragmento 'activo' actual. ty1)
2)
3)
fuente
Si llegas aquí y estás usando Kotlin:
R.id.fragment_container
es el lugarid
dondefragment
se presenta en suactivity
O si quieres una mejor solución:
fuente
Inspirado por la respuesta de Tainy , aquí están mis dos centavos. Poco modificado de la mayoría de las otras implementaciones.
Reemplace
"myActivity"
con "esto" si es su actividad actual o use una referencia a su actividad.fuente
Hay un método llamado
findFragmentById()
enSupportFragmentManager
. Lo uso en el contenedor de actividades como:Así es como obtener su actual
Fragment
. Si tiene una costumbreFragment
y necesita verificar quéFragment
es, normalmente usoinstanceof
:fuente
Si está utilizando el
AndroidX Navigation
:Para obtener más información sobre este componente de navegación: https://developer.android.com/guide/navigation/navigation-getting-started
fuente
your_navhost
.Esta es una forma sencilla de obtener el fragmento actual.
fuente
La respuesta de Sev funciona cuando presionas el botón Atrás o cambias la pila.
Sin embargo, hice algo un poco diferente. Tengo una configuración de escucha de cambio de backstack en un Fragmento base y sus fragmentos derivados y este código está en la escucha:
fuente
Esto es trabajo para mi. Espero que esto ayude a alguien.
fuente
Si obtiene la instancia actual de Fragmento de la actividad principal, puede simplemente
Esto realmente es la instancia actual de fragmento que se rellena en la vista. Tuve el mismo problema. Tuve que cargar el mismo fragmento dos veces manteniendo uno en el backstack.
El siguiente método no funciona. Simplemente obtiene un Fragment que tiene la etiqueta. No pierdas tu tiempo con este método. Estoy seguro de que tiene sus usos, pero obtener la versión más reciente del mismo Fragmento no es uno de ellos.
fuente
Echa un vistazo a esta solución. Me funcionó para obtener el Fragmento actual.
fuente
fuente
Bueno, supongo que esta es la respuesta más directa a esta pregunta. Espero que esto ayude.
fuente
Aquí hay una solución de Kotlin:
Forma simplificada:
fuente
Manera fácil de hacer eso:
fuente
En la actividad principal, se llama al método onAttachFragment (Fragment fragment) cuando se adjunta un nuevo fragmento a la actividad. En este método, puede obtener la instancia del fragmento actual. Sin embargo, no se llama al método onAttachFragment cuando se saca un fragmento de la pila, es decir, cuando se presiona el botón Atrás para colocar el fragmento superior en la parte superior de la pila. Todavía estoy buscando un método de devolución de llamada que se active en la actividad principal cuando un fragmento se hace visible dentro de la actividad.
fuente
En el caso de fragmentos desplazados, cuando use la instancia de la clase ViewPager, suponga que mVeiwPager, puede llamar a mViewPager.getCurrentItem () para obtener el número int del fragmento actual.
en MainLayout.xml
en MainActivity.kt
fuente
Descubrí
findFragmentByTag
que no es tan conveniente. Si tieneString currentFragmentTag
en suActivity
o padreFragment
, necesita guardarloonSaveInstanceState
y restaurarloonCreate
. Incluso si lo hace, cuando elActivity
recreada,onAttachFragment
será llamado antesonCreate
, por lo que no se puede utilizarcurrentFragmentTag
enonAttachFragment
(por ejemplo. Actualizar algunos puntos de vista basados encurrentFragmentTag
), ya que de fuerza aún no restaurado.Yo uso el siguiente código:
El documento de
FragmentManager
estado queCuando necesite hacer cosas basadas en el tipo de fragmento actual, simplemente use en
getCurrentFragment() instance of MyFragment
lugar decurrentFragmentTag.equals("my_fragment_tag")
.Tenga
getCurrentFragment()
en cuenta queonAttachFragment
no obtendrá elFragment
adjunto, sino el adjunto anterior.fuente
Tuve que hacer esto muy recientemente y ninguna de las respuestas aquí realmente se ajustaba a este escenario.
Si está seguro de que solo un fragmento estará visible (pantalla completa), entonces realmente desea encontrar lo que está en la parte superior de la pila. Por ejemplo, como
Kotlin
paraFragment
:Y úsalo como:
fuente
Puede hacerlo muy fácilmente también con una URL en logcat que lo redirigirá al código fuente del código fuente del fragmento actual. Primero, debe agregar un OnBackStackChangedListener en la actividad del host como -
Y la implementación de OnBackStackChangedListener es:
Y el método getStackTopName () es -
fuente