2013-01-16 12 views
35

Próbuję załadować nowy fragment, gdy wywoływana jest metoda. Ta metoda tworzy nowy fragment i "zamienia" drugi fragment:Android: Fragmenty backStack

To działa dobrze, dopóki nie wrócę. Ostatni fragment powinien zostać usunięty, kiedy wrócę. Zanim przejdę do implementacji metod na działania

public void onBackPressed(){} 

, aby usunąć ostatni fragment, chcę wiedzieć, czy obsługuję zmiany fragmentu poprawnie. Wygląda na to, że jestem brakuje czegoś tutaj ..

+0

Możliwy duplikat [Jak wdrożyć onBackPressed() we fragmentach?] (Http://stackoverflow.com/questions/5448653/how-to-implement-onbackpressed-in-fragments) –

Odpowiedz

78

Jeśli naprawdę chcesz, aby zastąpić fragment następnie użyć zastąpić() methode zamiast robić usuń() i dodatek().

FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(..............); 
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 

Nie zapomnij zrobić addToBackStack (null) więc swój poprzedni stan zostanie dodany do backstack co pozwala wrócić z przycisku Wstecz.

Zobacz także https://developer.android.com/reference/android/app/FragmentTransaction.html#replace(int, android.app.Fragment, java.lang.String).

Kolejnym dobrym źródłem jest http://developer.android.com/guide/components/fragments.html (funkcja search replace()).

+2

replace() = = remove (thisFragment) .add (anotherFragment). Replace jest równy obu metodom w tej kolejności. – Nepster

+0

@Nogster, prawda, ale nie zawsze jest to wygodne. FWIW, Różnica polega na tym, że Replace usuwa DOWOLNY fragment (y) w kontenerze; nie musisz znać 'thisFragment'. Jeden scenariusz, w którym to ma znaczenie, to fragment Fragment A, który jest fragmentem B1, który jest zamieniony na Fragment B2. WTEDY, jeśli chcesz przycisk "Wróć", aby powrócić do Fragmentu A (zamiast do B1), musimy ręcznie zakodować ten kod, ponieważ z powrotem Androida [nieprawidłowo IMHO] zrobi "usuń B1, dodaj A" - przeciwieństwo oryginalnego linku od A do B1. B2 czai się w widoku. Nasz kod musi wiedzieć, że B2 jest bieżącym fragmentem, a nie B1. Czasami jest to niewygodne. – ToolmakerSteve

4

Wystarczy usunąć pierwszy i wywołanie super.onBackPressed

public void onBackPressed(){ 

    // here remove code for your last fragment 
    super.onBackPressed(); 

} 
0
//lets wait for systems back to finish 

super.onBackPressed(); 

//here we believe a fragment was popped, so we need to remove the fragment from ourbackstack 
if(fragmentBackStack.size()>0) 
{ 
    Log.d("custombackstack","before back: "+fragmentBackStack.size()+" current:"+fragmentBackStack.peek()); 

    fragmentBackStack.pop();    
} 
//after popping is the size > 0, if so we set current fragment from the top of stack, otherwise we default to home fragment. 
if(fragmentBackStack.size()>0) 
{   
    Log.d("custombackstack","after back: "+fragmentBackStack.peek()); 
currentFragment = fragmentBackStack.peek();   
} 
else 
{   
    //back stack empty 
    currentFragment = HOME_FRAGMENT; 
} 
Powiązane problemy