2012-06-22 18 views
14

Estoy creando una aplicación de múltiples fragmentos de actividad. Lo agrego a la backstack después de cada transacción. Después de un par de ocultar y mostrar fragmentos y luego rotar el teléfono, todos los fragmentos añadidos en el contenedor se restauraron y cada fragmento está uno encima del otro.fragmentos de backstack ocultos que se muestran nuevamente en el cambio de configuración

¿Cuál puede ser el problema? ¿Por qué mi actividad muestra los fragmentos que he ocultado anteriormente?

Estoy pensando en ocultar todos los fragmentos previamente ocultos, pero ¿hay una manera más 'elegante' de hacer esto?

+0

para notar, fragmentos ocultos ya se mantienen en el recipiente tan invisible. Así que cambiar la configuración podría mostrarlos nuevamente ya que ya están allí. – zgulser

Respuesta

0

Es posible que desee intentar utilizar la función replace() en lugar de ocultar y mostrar. Tuve el mismo problema cuando comencé a usar Fragments y el uso de la función de reemplazo realmente me ayudó a administrar mejor el Fragments. Aquí está un ejemplo rápido:

fragmentManager.replace(R.id.fragmentContainer, desiredFragment, DESIRED_FRAGMENT_TAG)         
       .addToBackStack(null) 
       .commit(); 
9

Uso setRetainInstance(true) en cada fragmento y el problema desaparecerá.
Advertencia: estableciendo esto en true cambiará el ciclo de vida de Fragments.
Aunque setRetainInstance(true) resuelve el problema, puede haber casos en los que no desee usarlo. Para corregir esto, la configuración de un atributo booleano en el fragmento y restaurar 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 los cambios de configuración (por ejemplo orientación de la pantalla), la instancia será destruida, pero el Bundle se almacenará y se inyectaron a la nueva instancia de Fragment.

2

Tuve el mismo problema. debe verificar 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"> 

Cuestiones relacionadas