2013-08-19 9 views
6

Chcę być w stanie odwrócić replaceFragmentTransaction za pomocą addToBackStack():Klikając przycisk Wstecz po transakcji fragment z zastosowaniem addToBackStack robi nic

FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();   
Fragment scheduleFragment = new ScheduleFragment();  
fragmentTransaction.replace(R.id.content_container, scheduleFragment, "scheduleFragment"); 
fragmentTransaction.addToBackStack("scheduleFragment"); 
fragmentTransaction.commit(); 

ale po tym, klikając przycisk wstecz nic nie robi.

Z dokumentu i ma to odwrócić transakcję.

Czego mi brakuje?

+2

The [doc] (http://developer.android.com/training/implementing-navigation/temporal.html) (patrz "Implementacja nawigacji wstecz dla fragmentów") mówi o użyciu '.add' zamiast' .replace '. Sprawdź odpowiedzi tutaj: http://stackoverflow.com/questions/18634207/difference-between-add-replace-and-addtackstack , ale domyślam się, że '.replace' nie jest w pełni obsługiwany, podczas gdy' .add' wydaje się działać prawidłowo. – electrocrat

+0

@Abel Paz 'odpowiedź poniżej jest poprawką dla problemu z '.replace' – electrocrat

Odpowiedz

4

Spróbuj fragmentTransaction.addToBackStack(null) Parametr dla addToBackStack() jest opcjonalną nazwą tylnej państwa, aby nie używać tagu w metodzie replace() który jest tylko opcjonalny znacznik dla fragmentu. Możesz przeczytać więcej na ten temat here.

+0

Potrzebuję tagu. – jul

+0

Tak, możesz zachować znacznik odwołania do fragmentu, ale czy działa 'addToBackStack (null)'? Co się stanie, jeśli użyjesz tego? –

+0

Nie próbowałem, ponieważ nie ma to dla mnie sensu. Więc zaimplementowałem własny stos 'Fragment' (zobacz moją odpowiedź). – jul

0

I wdrożone moje własne Fragment stosu:

public Fragment addFragmentToStack(Fragment fragment){ 
    if(MyApplication.fragmentStack.size()>20){ 
     MyApplication.fragmentStack.remove(0); 
    } 
    return MyApplication.fragmentStack.push(fragment); 
} 

public void onBackPressed() { 
     if (MyApplication.fragmentStack.size() > 0) { 
      FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      ft.replace(R.id.content_container, MyApplication.fragmentStack.pop()); 
      ft.commit(); 
     } 
     else{ 
      finish(); 
     } 
} 
24

Prawo sposobem na to jest za pomocą onBackPressed() metody połowu, że zdarzenie z powrotem w swojej aplikacji, a następnie „pop” z backStack z popBackStack(). Na przykład:

public void onBackPressed() 
{ 
    // Catch back action and pops from backstack 
    // (if you called previously to addToBackStack() in your transaction) 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0){ 
     getSupportFragmentManager().popBackStack(); 
    } 
    // Default action on back pressed 
    else super.onBackPressed(); 
} 

PD: Przepraszam za opóźnione odpowiedzi, ale właśnie zobaczyłem twoje pytanie. Mam nadzieję, że to pomoże!

+0

Więc dlaczego, do diabła, w dokumentacji Androida, komunikowali się w niewłaściwy sposób. :( –

+2

Nie sądzę, że ta logika jest konieczna, aplikacja będzie działać dokładnie tak samo, jeśli użyjesz 'addToBackStack'. –

+0

W przeciwieństwie do tego, jak wszystkie doco zdają się wskazywać na użycie tych konstrukcji, ja również jestem w stanie działaj zgodnie z zamierzeniami z dodaniem tego kodu w 'OnBackPressed':/ – bc3tech

2

Minęło trochę czasu, ale mam nadzieję, że to pomoże komuś.

fragmentTransaction.addToBackStack(null) nie zadziała, jeśli będziesz przedłużać AppCompatActivity. Działa dobrze w Activity. Nie mogłem znaleźć przyczyny.

Powiązane problemy