2012-06-22 11 views
14

Sto costruendo un'applicazione one-multiple-framments. Aggiungo al backstack dopo ogni transazione. Dopo un paio di tentativi di nascondere e mostrare i frammenti e quindi ruotare il telefono, tutti i frammenti aggiunti sul contenitore sono stati ripristinati e ogni frammento è sovrapposto all'altro.frammenti backstack nascosti rivisualizzati sul cambio di configurazione

Quale può essere il problema? Perché la mia attività mostra i frammenti che ho precedentemente nascosto?

Sto pensando di nascondere tutti i frammenti precedentemente nascosti-ora mostrati, ma c'è un modo più "aggraziato" per farlo?

+0

Solo per notare, frammenti nascosti sono già tenuti nel contenitore invisibile. Pertanto, la modifica della configurazione potrebbe mostrarli di nuovo poiché sono già presenti. – zgulser

risposta

0

Si potrebbe voler provare a utilizzare la funzione replace() anziché nascondere e mostrare. Ho avuto lo stesso problema quando ho iniziato a utilizzare Fragments e l'utilizzo della funzione di sostituzione mi ha aiutato a gestire meglio lo Fragments. Ecco un rapido esempio:

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

Usa setRetainInstance(true) su ogni frammento e il problema scompare.
Avvertenza: impostando su true cambierà il ciclo di vita dei Fragments.
Mentre setRetainInstance(true) risolve il problema, potrebbero verificarsi casi in cui non si desidera utilizzarlo. Per rimediare, impostare un attributo booleano sulla Frammento e ripristinare la visibilità:

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); 
    } 
} 

volta che cambia la configurazione (es orientazione schermo), l'istanza sarà distrutta, ma il bundle saranno memorizzati e iniettato al nuova istanza di Fragment.

2

Ho avuto lo stesso problema. dovresti controllare il codice sorgente nella funzione onCreateView() della tua attività.

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"> 

Problemi correlati