Fragmentos ocultos backstack re-mostrado en el cambio de configuración
Estoy construyendo una aplicación de una actividad de múltiples fragmentos. Añado al backstack después de cada transacción. Después de un par de ocultos y mostrando fragmentos y luego girar el teléfono, todos los fragmentos añadidos en el contenedor fueron restaurados y cada fragmento está encima del otro.
¿Cual puede ser el problema? ¿Por qué mi actividad muestra los fragmentos que he ocultado anteriormente?
- Fragmento de la pila trasera y isRemoving ()
- Android: usando la animación predeterminada de la actividad para Fragmentos
- No se puede realizar esta acción después de onSaveInstanceState - DialogFragment
- ¿Cómo hacer que la clase AndroidApplication de LibGDX admita Fragmentos de Android?
- Cómo pasar datos entre fragmentos
Estoy pensando en ocultar todos los fragmentos anteriormente ocultos-ahora-mostrados, pero ¿hay una manera más "graciosa" de hacer esto?
- Ver saltos y parpadea al instante, aunque animateLayoutChanges = "true"
- Los datos de ViewPager se pierden al volver de la siguiente pantalla
- Saltar algunos fragmentos enBackPressed
- Fragmentos, exhibido, uno encima de otro
- Fragmento dentro de la pestaña ¿Actividad perdiendo todos los datos al girar?
- Actualizar el fragmento ListView cuando no está enfocado
- Dos fragmentos en una página de viewpager
- Cómo implementar mostrar y ocultar fragmento dentro de fragmento en android
Utilice setRetainInstance(true)
en cada fragmento y su problema desaparecerá.
Advertencia: el ajuste a true cambiará el ciclo de vida de Fragmentos.
Aunque setRetainInstance(true)
resuelve el problema, puede haber casos en los que no desea utilizarlo. Para solucionarlo, configure un atributo booleano en el Fragmento y restablezca la visibilidad:
private boolean mVisible = true; @Override public void onCreate(Bundle _savedInstanceState) { super.onCreate(_savedInstanceState); if (_savedInstanceState!=null) { mVisible = _savedInstanceState.getBoolean("mVisible"); } if (!mVisible) { getFragmentManager().beginTransaction().hide(this).commit(); } // Hey! no setRetainInstance(true) used here. } @Override public void onHiddenChanged(boolean _hidden) { super.onHiddenChanged(_hidden); mVisible = !_hidden; } @Override public void onSaveInstanceState(Bundle _outState) { super.onSaveInstanceState(_outState); if (_outState!=null) { _outState.putBoolean("mVisible", mVisible); } }
Una vez que cambie la configuración (por ejemplo, la orientación de la pantalla), la instancia se destruirá, pero el Bundle se almacenará e inyectará en la nueva instancia de Fragment.
Es posible que desee intentar utilizar la función replace()
lugar de ocultar y mostrar. Tuve el mismo problema cuando empecé a usar Fragments
y usar la función de reemplazar realmente ayudó a administrar los Fragments
mejor. Aquí está un ejemplo rápido:
fragmentManager.replace(R.id.fragmentContainer, desiredFragment, DESIRED_FRAGMENT_TAG) .addToBackStack(null) .commit();
Yo tuve el mismo problema. Debe comprobar el código fuente en la función onCreateView () de su actividad.
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); if(savedInstanceState == null){//for the first time FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); FragmentExample fragment = new FragmentExample(); fragmentTransaction.add(R.id.layout_main, fragment); fragmentTransaction.commit(); }else{//savedInstanceState != null //for configuration change or Activity UI is destroyed by OS to get memory //no need to add Fragment to container view R.id.layout_main again //because FragmentManager supported add the existed Fragment to R.id.layout_main if R.id.layout_main is existed. //here is one different between Fragment and View } }
Activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/layout_main">
- Notificación de sonido, vibración y LED no funcionan
- Compilación de Lua lib para Android – éxito, pero extraños segfaults