2013-09-25 17 views
7

Jestem zainteresowany najlepszym sposobem na pojedyncze działanie, które przełącza się między dwoma fragmentami.Najlepszy sposób na przełączanie między dwoma fragmentami

Przeczytałem prawdopodobnie 15 stosów przepełnienia stosu i 5 postów na blogach, jak to zrobić, i chociaż wydaje mi się, że wybrałem rozwiązanie, nie jestem przekonany, że jest najlepszy. Chcę więc wysłuchać opinii ludzi na temat właściwej metody radzenia sobie z tym, zwłaszcza w odniesieniu do cyklu życia rodzicielskiej działalności i fragmentów.

tutaj sytuacja w szczegółach:

  1. Czynność nadrzędny może posiadać jedną z dwóch możliwych fragmentów.
  2. Dwa fragmenty mają stan, który chciałbym zachować podczas sesji, ale niekoniecznie musi być utrzymywany między sesjami.
  3. Wiele innych czynności, które sprawiają, że aktywność nadrzędna i fragmenty mogą zostać pochowane w tylnym stosie i zniszczone z powodu małej ilości pamięci.
  4. Chcę użyć przycisku wstecz, aby poruszać się między fragmentami (Tak, jak rozumiem, nie mogę użyć setRetainInstance).

Oprócz ogólnej architektury radę, mam następujący zaległe pytania:

  1. Jeżeli aktywność rodzic jest niszczone z powodu braku pamięci, w jaki sposób mogę zagwarantować, że zostaną zachowane stany obu fragmentów , jak na ten post: When a Fragment is replaced and put in the back stack (or removed) does it stay in memory?. Czy potrzebuję tylko wskaźnika do każdego fragmentu w działaniu nadrzędnym?
  2. Jaki jest najlepszy sposób monitorowania aktywności nadrzędnego obiektu, który aktualnie wyświetla?

Z góry dziękuję!

Odpowiedz

6

Doszedłem do dodania obu fragmentów za pomocą menedżera fragmentów pomocniczych, a następnie za pomocą odłączania/dołączania przełączam się między nimi.Udało mi się użyć commitAllowingStateLoss(), ponieważ zachowałem stan widoku w innym miejscu i ręcznie ustawiłem poprawny fragment w onResume().

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.add(R.id.my_layout, new AFragment(), TAG_A); 
    fragmentTransaction.add(R.id.my_layout, new BFragment(), TAG_B); 
    fragmentTransaction.commit(); 
} 

public void onResume() { 
    super.onResume(); 
    if (this.shouldShowA) { 
     switchToA(); 
    } else { 
     switchToB(); 
    } 
} 

private void switchToA() { 
    AFragment fragA = (AFragment) getSupportFragmentManager().findFragmentByTag(TAG_A); 
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.detach(getSupportFragmentManager().findFragmentByTag(TAG_B)); 
    fragmentTransaction.attach(fragA); 
    fragmentTransaction.addToBackStack(null); 

    fragmentTransaction.commitAllowingStateLoss(); 
    getSupportFragmentManager().executePendingTransactions(); 
} 
2

Możesz rozważyć użycie ViewPager w swojej Rodzicielskiej Działalności, aby móc przełączać się między Fragmentami.

Dzięki temu można je przesuwać.

Jeśli chcesz zachować swój stan podczas sesji, nawet jeśli działanie rodzica jest zniszczone, musisz je ustawić jako Parcelable, aby można było zapisać stan nawet wtedy, gdy klasa nie jest utworzona w tym czasie. Trzeba to również zrobić, jeśli obracasz urządzeniem i chcesz zachować bieżącą sytuację/dane na ekranie.

Powinieneś zapisać je na Parcelable w swoich metodach i odtworzyć je z niego w postaci onResume. W ten sposób nie ma znaczenia, czy są one niszczone, czy też muszą zostać odtworzone ze względu na zmiany orientacji urządzeń.

Jeśli chcesz mieć możliwość przełączania się między tymi fragmentami za pomocą przycisku Wstecz, możesz kliknąć przycisk Kliknij, aby uzyskać onBackPressed i odpowiednio go obsłużyć.

Jeśli chcesz dowiedzieć się, jaki Fragment wyświetlasz w danym momencie, pytasz o swój ViewPager jaki Fragment on wyświetla w tym czasie, więc nie musisz śledzić, możesz po prostu zapytać kogoś, kto wie, czy musisz to wiedzieć.

+0

Dzięki za odpowiedź. Nie sądzę, abym mógł używać tutaj pagera widoku, ponieważ widoki nie powinny być przesuwane między. Zdecydowanie zaimplementuję działkę parującą. Gdzie mogę wdrożyć onBackPressed? – GLee

+0

OnBackPressed to metoda działania. Więc będziesz musiał to zmienić. –

Powiązane problemy