Android Fragments recreado en el cambio de orientación
Estoy desarrollando una aplicación que básicamente tiene una ActionBar. Cuando mi aplicación se inicia, la actividad crea los fragmentos y los adjunta a cada ficha, por lo que cuando cambie obtendré diferentes vistas.
Los problemas surgen cuando intento girar el dispositivo. Después de un poco de lucha, me di cuenta de que Android recrea automáticamente los fragmentos agregados anteriormente como este:
- Fragmento android creado dos veces en el cambio de orientación
- Evitar reiniciar fragmento asynctask en cambio de orientación de pantalla
- Cómo administrar el estado de la interfaz de usuario y la pila posterior en un diseño de panel único / dual
- sensorPortrait: ¿Cómo capturar la orientación cambiante?
- Forzar cierre en modo horizontal, pero no en vertical
SummaryFragment.onCreate(Bundle) line: 79 FragmentManagerImpl.moveToState(Fragment, int, int, int) line: 795 FragmentManagerImpl.moveToState(int, int, int, boolean) line: 1032 FragmentManagerImpl.moveToState(int, boolean) line: 1014 FragmentManagerImpl.dispatchCreate() line: 1761 DashboardActivity(Activity).onCreate(Bundle) line: 864 ...
Y luego recreo los fragmentos como de costumbre. Así que tengo los fragmentos "reales" que espero que funcionen correctamente y sus homólogos "ocultos" creados por Android que hacen que mi aplicación se bloquee. ¿Cómo puedo evitar este comportamiento? Ya intenté llamar a setRetainInstance (false) en el SummaryFragment.
Gracias
- Cómo funciona la restauración automática de fragmentos
- Cómo quitar las pestañas de ActionBar en la orientación horizontal sólo para las tabletas
- cómo guardar el estado con onSaveInstanceState y onRestoreInstanceState mientras cambia la orientación
- ¿Cómo arreglar la orientación del diseño vertical?
- Reproductor multimedia no carga cuando la actividad recreada en la orientación cambia android
- Restaurar el estado de TextView después de la rotación de la pantalla?
- Cómo rotar vistas sobre el cambio de orientación sin volver a crear el diseño?
- VideoView no sigue la configuración de orientación de la actividad
Usted necesita comprobar para un savedInstanceState [edit: en su actividad del padre], y si existe, no cree sus fragmentos.
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); if (savedInstanceState == null) { // Do your oncreate stuff because there is no bundle } // Do stuff that needs to be done even if there is a saved instance, or do nothing }
Cuando cree su actividad, compruebe que no existe. Si existe, no haga nada … Android lo recreará para usted.
private void initFragment() { FragmentManager fragMgr = getSupportFragmentManager(); if (fragMgr.findFragmentByTag(LEADERBOARD_FRAG_TAG) != null) { return; } frag = new HdrLeaderboardFragment(); FragmentTransaction ft = fragMgr.beginTransaction(); ft.replace(R.id.leaderboard_fragment_wrapper, frag, LEADERBOARD_FRAG_TAG); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ft.commit(); }
Si tienes el ui similar (no hay archivos específicos de layout-land) para ambas orientaciones puedes establecer android:configChanges="keyboardHidden|orientation"
a la actividad en tu archivo de manifiesto.
Si no proporciona por favor el código fuente en el que está agregando los fragmentos a las pestañas, y trataré de ayudarle con las mejoras.
No estoy seguro si hay una mejor solución, pero esto es lo que hice en el último programa.
Cuando un fragmento es creado automáticamente por el sistema en el cambio de orientación y si desea mantener un seguimiento de ellos en la actividad de host, captura en el método OnAttachFragment()
la actividad del OnAttachFragment()
. Y obtienen los argumentos de forma predeterminada, por lo que puede utilizarlos para averiguar qué fragmento es.
public void onAttachFragment(Fragment fragment) { super.onAttachFragment(fragment); if (fragment != null) { if(fragment.getArguments() != null) { switch (fragment.getArguments().getString(ARG_PARAM1)) { case FragmentATag: if (myFragmentA != fragment) { myFragmentA = (FragmentA) fragment; } break; case FragmentBTag: if (myFragmentB != fragment) { myFragmentB = (FragmentB) fragment; } break; } } } }
- SDK de Android no reconoce el dispositivo debugable
- Cómo configurar el menú en la barra de herramientas en Android