2012-12-08 8 views
7

Ich habe Probleme herauszufinden, die richtige Methode, um durch Fragmente ohne einen Pager zu navigieren, und ich habe Probleme bei der Konfiguration Änderungen für die Bildschirmausrichtung. Ich verwende Show/Hide auf den Fragmenten, um sie sichtbar und funktional zu machen, aber ich frage mich, ob ich stattdessen Detach/Attach verwenden sollte. Ich habe auch Probleme beim Hinzufügen von Dingen zum Backstack und ich denke, es liegt auch an der Verwendung von show/hide. Ist es besser, Attach/detatch zu verwenden oder gibt es eine Möglichkeit, zu überschreiben, was die Zurück-Schaltfläche bewirkt, um das letzte/aktuelle Fragment ein-/auszublenden. Das Verhalten: Ich habe ein Map-Fragment und ein List-Fragment zusammen mit ein paar anderen. alles läuft richtig an und funktioniert zunächst mit Orientierungsänderungen. Wenn ich zur Listenansicht navigiere, wird sie korrekt ausgefüllt, aber bei einer Orientierungsänderung wird die Liste ohne die darin enthaltenen Daten neu gezeichnet. Die Kartenansicht wird ebenfalls neu gezeichnet und ist hinter meinem Pager-Titelindikator sichtbar. Wenn mir jemand in die richtige Richtung zeigen könnte, um das zu lösen, wäre das großartig. Ich vermute, dass das durch die Art und Weise verursacht wird, dass ich die Fragmente zeige und verstecke.Fragmente Detatch/Reassach Vs Einblenden/Ausblenden

Hier ist, wo ich die Fragmente erstellen und sie dem Fragment-Manager hinzufügen. Ich habe auch gezeigt, wo ich Fragmente zeige/verstecke.

@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

Wenn Sie möchten, dass Ihre Aktivität nicht mehr bei einer Orientierungsänderung gestartet wird, können Sie android: configChanges = "orientation | keyboardHidden" im Manifest hinzufügen. – Faizan

+0

Trennen/Anhängen werden die Ressourcen frei, während verstecken/anzeigen nicht. – Faizan

Antwort

4

Es ist nicht deine Schuld. Das Problem ist, dass, wenn die Ausrichtung ändert alle Aktivität zerstört wird, auch alle Fragmente hinzugefügt. Daher wird keine der darin enthaltenen Daten beibehalten. Es wird nicht empfohlen, android:configChanges="orientation|keyboardHidden" zu verwenden. Setzen Sie lieber für jedes Fragment setRetainInstance(true) und es funktioniert gut mit Ihrem aktuellen Code.

+0

Dies funktioniert nicht für mehrere Fragmente auf einem einzigen Bildschirm. Aber es hätte mein Problem gelöst, hätte ich nicht aufgegeben und alles anders gemacht. – doubleA

+0

Dies beantwortet nicht wirklich die Frage im Titel. – zgulser

0

Wenn Sie eine bessere Persistenz wünschen (z. B. wenn die Aktivität vorübergehend wegen Platzproblemen zerstört wird), denken Sie auch daran, den Zustand Ihrer Fragmente mit onSaveInstanceState zu speichern. setRetainInstance funktioniert nur, wenn eine Konfigurationsänderung bevorsteht.