¿Hay una manera de obtener referencias para todos los fragmentos actualmente activos en una actividad?
No he encontrado una forma sencilla de obtener todos los fragmentos actualmente activos (visible, actualmente en estado reanudado) en una actividad. ¿Es posible sin contabilidad personalizada en mi Actividad? Parece que el FragmentManager no admite esta característica.
- Pasar datos entre fragmentos en la misma actividad
- Cómo cerrar el fragmento actual mediante el botón como el botón Volver?
- Implementación de Google Map APIv2, línea de archivo XML binario # 6: Error al inflar fragmento de clase
- No se puede realizar esta acción después de onSaveInstanceState - DialogFragment
- Reemplazar un Fragmento consigo mismo no muestra nada
- FragmentPagerAdapter no está quitando elementos (Fragmentos) correctamente
- Cómo obtener una indicación de que el usuario está intentando desplazarse más en un ViewPager
- MapFragment en las pestañas de barra de acción
- OnStart of new Actividad se llama antes de onStop de padre
- Eliminar un ViewPager mediante programación, ¿cuándo son (o cómo puedo asegurarlo) que se han destruido fragmentos?
- Mostrando bloques de DialogFragments ICS
- Fragmento Android Cambiar Título
- Contexto en un fragmento de preferencia
Parece que la API pierde actualmente un método como "getFragments".
Sin embargo, utilizando el evento "onAttachFragment" de la clase Actividad debe ser bastante fácil de hacer lo que quieras. Yo haría algo como:
List<WeakReference<Fragment>> fragList = new ArrayList<WeakReference<Fragment>>(); @Override public void onAttachFragment (Fragment fragment) { fragList.add(new WeakReference(fragment)); } public List<Fragment> getActiveFragments() { ArrayList<Fragment> ret = new ArrayList<Fragment>(); for(WeakReference<Fragment> ref : fragList) { Fragment f = ref.get(); if(f != null) { if(f.isVisible()) { ret.add(f); } } } return ret; }
En caso de que no haya un método listo para leer el estado desde el objeto (isActive () en el ejemplo), anularía onResume y onPause para establecer un flag (podría ser sólo un campo bool).
Eso ya es algo propio de la contabilidad, pero todavía muy limitado en mi opinión teniendo en cuenta el objetivo muy específico que desea lograr (estado dependiente de la lista).
Si utiliza la Biblioteca de soporte técnico de Android, puede llamar al método FragmentManager.getFragments()
oculto:
public List<Fragment> getVisibleFragments() { List<Fragment> allFragments = getSupportFragmentManager().getFragments(); if (allFragments == null || allFragments.isEmpty()) { return Collections.emptyList(); } List<Fragment> visibleFragments = new ArrayList<Fragment>(); for (Fragment fragment : allFragments) { if (fragment.isVisible()) { visibleFragments.add(fragment); } } return visibleFragments; }
Otra manera de hacer esto sería poner etiquetas en tus fragmentos cuando los agregas a la actividad.
Por ejemplo, si agrega dinámicamente 4 fragmentos, puede agregarlos como:
for (int i = 0; i < NUM_FRAGMENTS; i++){ MyFragment fragment = new Fragment(i); fragmentTransaction.add(R.id.containerId, fragment, SOME_CUSTOM_PREFIX + i).commit() }
Luego, si necesita recuperar todos los fragmentos más tarde, puede hacer lo siguiente:
for (int i = 0; i < NUM_FRAGMENTS; i++) { String tag = SOME_CUSTOM_PREFIX + i; fragmentList.add((MyFragment) fragmentManager.findFragmentByTag(tag)); }
Resolví con esto:
public ArrayList<Fragment> getAllFragments() { ArrayList<Fragment> lista = new ArrayList<Fragment>(); for (Fragment fragment : getSupportFragmentManager().getFragments()) { try { fragment.getTag(); lista.add(fragment); } catch (NullPointerException e) { } } return lista; }
android.support.v4.app.FragmentManager
tiene un método llamado getFragments()
que hace exactamente lo que necesita, pero nunca fue accesible. De repente, sin embargo, lo es, pero no estoy seguro si eso está previsto porque todavía está marcado como oculto.
/** * Get a list of all fragments that have been added to the fragment manager. * * @return The list of all fragments or null if none. * @hide */ public abstract List<Fragment> getFragments();
El FragmentManager
regular no tiene este método en absoluto, pero si realmente se necesita, puede acceder al mismo objeto obteniendo el campo mActive
través de la reflexión. Uso a riesgo propio 🙂
- Cómo obtener estadísticas de los desarrolladores de Google Play con una API
- ¿Cómo saber si un RecyclerView / LinearLayoutManager se desplaza hacia arriba o abajo?