2012-12-08 5 views
7

Mam problem z ustaleniem właściwego sposobu poruszania się po fragmentach bez stronicowania i mam problemy podczas zmiany konfiguracji dla orientacji ekranu. Używam Show/Hide na fragmentach, aby były widoczne i funkcjonalne, ale zastanawiam się, czy powinienem zamiast tego używać Detach/Attach. Mam również problemy z dodawaniem rzeczy do tylnego stosu i myślę, że jest to również spowodowane użyciem show/hide. Czy lepiej jest użyć Attach/złapać, czy istnieje sposób na zastąpienie tego, co robi przycisk Wstecz, aby pokazać/ukryć ostatni/bieżący fragment.Fragmenty Odcięcie/Ponowne dołączanie Vs Pokaż/ukryj

Zachowanie: Mam fragment mapy i fragment listy wraz z kilkoma innymi. wszystko uruchamia się prawidłowo i działa początkowo ze zmianami orientacji. Kiedy nawiguję do widoku listy, zapełnia się poprawnie, ale po zmianie orientacji lista zostaje przerysowana bez danych. Widok mapy również zostanie przerysowany i jest widoczny za wskaźnikiem tytułu pagerów. Jeśli ktokolwiek mógłby wskazać mi właściwy kierunek, by rozwiązać ten problem, byłoby to niesamowite. Podejrzewam, że przyczyną jest sposób, w jaki pokazuję i ukrywam fragmenty.

Tutaj utworzę Fragmenty i dodaję je do menedżera fragmentów. Pokazałem także, gdzie pokazuję/ukrywam fragmenty.

@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

Jeśli chcesz, aby twoja aktywność nie została ponownie uruchomiona po zmianie orientacji, możesz dodać w manifeście android: configChanges = "orientation | keyboardHidden". – Faizan

+0

Odłącz/Załącz uwolni zasoby, a ukryj/pokaż nie. – Faizan

Odpowiedz

4

To nie twoja wina. Problem polega na tym, że kiedy orientacja zmienia całą Aktywność jest Zniszczona, dodawane są nawet wszystkie fragmenty. Dlatego żadne z danych w nim nie jest zachowane. Nie zaleca się używania android:configChanges="orientation|keyboardHidden". Zamiast tego ustaw dla każdego fragmentu setRetainInstance(true) i będzie dobrze działać z bieżącym kodem.

+0

To nie działa dla wielu fragmentów na jednym ekranie. Ale rozwiązałbym mój problem powyżej, gdybym nie poddał się i nie przerobił wszystkiego inaczej. – doubleA

+0

To nie odpowiada na pytanie w tytule. – zgulser

0

Jeśli chcesz mieć lepszą trwałość (na przykład, gdy aktywność jest czasowo zniszczona w przypadku problemów z przestrzenią), pamiętaj również, aby zapisać stan swoich fragmentów za pomocą onSaveInstanceState. setRetainInstance będzie działać tylko wtedy, gdy zbliża się zmiana konfiguracji.