2012-12-08 11 views
7

Sto avendo difficoltà a capire il modo corretto di navigare attraverso i frammenti senza un cercapersone e sto avendo problemi durante la configurazione cambia per l'orientamento dello schermo. Sto usando Show/Hide sui frammenti per renderli visibili e funzionali, ma mi chiedo se invece dovrei usare Detach/Attach. Sto anche avendo problemi ad aggiungere cose allo stack e penso che sia anche dovuto all'uso di show/hide. È meglio usare Attach/detatch o c'è un modo per ignorare ciò che fa il pulsante Indietro per farlo mostrare/nascondere l'ultimo/frammento corrente.Frammenti detatch/Ricollegare VS Mostra/Nascondi

il comportamento: Ho un frammento di mappa e un frammento lista insieme a pochi altri. tutto si avvia correttamente e funziona inizialmente con modifiche di orientamento. Quando navigo nella visualizzazione elenco, viene compilato correttamente, ma in seguito all'orientamento l'elenco viene ridisposto senza i dati in esso contenuti. Anche la vista mappa viene ridisegnata ed è visibile dietro l'indicatore del titolo del cercapersone. Se qualcuno potrebbe per favore mi punto nella giusta direzione per risolvere questo sarebbe fantastico. Sospetto che sia causato dal modo in cui sto mostrando e nascondendo i frammenti.

Qui è dove creo i Frammenti e aggiungerli al gestore frammento. Ho anche mostrato dove mostro/nascondo i frammenti.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map_frags); 
    mapViewContainer = LayoutInflater.from(this) 
      .inflate(R.layout.map, null); 

    setupFragments(); 
    showFragment(0); 
} 
public void setListData(String name) { 
    bName = name; 
    showFragment(1); 
} 
private void setupFragments() { 
    final FragmentManager fm = getSupportFragmentManager(); 
    final FragmentTransaction ft = fm.beginTransaction(); 
    mFragment1 = fm.findFragmentByTag("f1"); 
    if (mFragment1 == null) { 
     mFragment1 = new MenuFragment(); 
     ft.add(mFragment1, "f1"); 
     ft.hide(mFragment1); 
    } 
    mMapFragment = (MapFragment) getSupportFragmentManager() 
      .findFragmentByTag(MapFragment.TAG); 
    if (mMapFragment == null) { 
     mMapFragment = MapFragment.newInstance(0); 
     ft.add(R.id.fragment_container, mMapFragment, MapFragment.TAG); 
    } 
    ft.hide(mMapFragment); 

    myListFragment = (ListFrag) getSupportFragmentManager() 
      .findFragmentByTag(ListFrag.TAG); 
    if (myListFragment == null) { 
     myListFragment = new ListFrag(); 
     ft.add(R.id.fragment_container, myListFragment, ListFrag.TAG); 
    } 
    ft.hide(myListFragment); 

    frag = (frag) getSupportFragmentManager().findFragmentByTag(
      frag.TAG); 
    if (frag == null) { 
     bacFrag = new frag(); 
     ft.add(R.id.fragment_container, frag, frag.TAG); 
    } 
    ft.hide(bacFrag); 
    ft.commit(); 
} 

public void showFragment(int fragIn) { 
    final FragmentTransaction ft = getSupportFragmentManager() 
      .beginTransaction(); 
    ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 
    if (mVisible != null) { 
     if (mVisible == mListFragment) { 
      ft.remove(mListFragment); 
     } else { 
      ft.hide(mVisible); 
     } 
    } 

    switch (fragIn) { 
    case 0: 
     ft.show(mMapFragment); 
     ft.commit(); 
     mVisible = mMapFragment; 
     break; 
    case 1: 
     mListFragment = (ListFragmentDisplay) getSupportFragmentManager() 
       .findFragmentByTag(ListFragmentDisplay.TAG); 
     Toast.makeText(this, "startListFrag", Toast.LENGTH_LONG).show(); 
     if (mListFragment == null) { 
      mListFragment = new ListFragmentDisplay(); 
      ft.add(R.id.fragment_container, mListFragment, 
        ListFragmentDisplay.TAG); 
     } 
     ft.show(mListFragment).commit(); 
     mVisible = mListFragment; 
     break; 
    case 2: 
     ft.show(myfragment).commit(); 
     mVisible = myfragment; 
     break; 
    case 3: 
     ft.show(frag).commit(); 
     mVisible = frag; 
     break; 
    } 
} 
+0

se si desidera interrompere la propria attività dal riavvio sulla modifica dell'orientamento, è possibile aggiungere android: configChanges = "orientation | keyboardHidden" nel manifest. – Faizan

+0

Scollega/Collega libererà le risorse, mentre nascondere/mostrare non lo farà. – Faizan

risposta

4

Non è colpa tua. Il problema è che quando l'orientamento cambia tutta l'attività è distrutta, anche tutti i frammenti aggiunti. Quindi nessuno dei dati al suo interno viene mantenuto. Non è consigliato l'utilizzo di android:configChanges="orientation|keyboardHidden". Piuttosto, fissato per ogni frammento setRetainInstance(true) e funzionerà bene con il tuo codice corrente.

+0

Questo non funziona per più frammenti su una singola schermata. Ma avrebbe risolto il mio problema sopra se non avessi rinunciato e rifatto tutto in un altro modo. – doubleA

+0

In realtà non risponde alla domanda nel titolo. – zgulser

0

Se si desidera avere una persistenza migliore (ad esempio quando l'attività viene temporaneamente distrutta per problemi di spazio), ricordare anche di salvare lo stato dei frammenti con onSaveInstanceState. setRetainInstance funzionerà solo quando sta per essere apportata una modifica alla configurazione.