2013-04-26 14 views
9

Mamy działanie zawierające menu przesuwania (https://github.com/jfeinstein10/SlidingMenu), w którym dostępne są trzy opcje, nazwijmy je A, B1, C1. Odpowiadają one fragmentom, które pokazujemy w działaniu. Po wybraniu innej opcji z Menu przesuwania zamieniam bieżący fragment na nowy poprzez FragmentManager.Clear Android Fragment z powrotem stos bez poppingu?

Od Fragmentu B1 możesz przejść do dwóch innych, nazwijmy je B2 i B3. Tutaj chcemy, aby klawisz Back zabrał cię z B2 -> B1 lub z B3 -> B1, więc nazywam transaction.addToBackStack (null). Jeśli wybierzemy opcję z menu przesuwania, gdy jesteś na B2 lub B3, chcemy wyczyścić tylny stos, więc używam kodu sugerowanego w tym pytaniu Clear back stack using fragments, który wywołuje popBackStack(), dopóki nie będzie jasne.

Jak dotąd tak dobrze.

Z Fragmentu C1 możesz przejść do Fragmentu C2. Jako C1/C2 są bardziej od projektu Master/Detail używam

fragmentTransaction.setCustomAnimations(R.animator.slide_in_from_right, 
    R.animator.slide_out_to_left, R.animator.slide_in_from_left, 
    R.animator.slide_out_to_right); 

dodać animację slajdów gdzie C1 wysuwa się w lewo, jak ślizga C2 z prawej strony, i vice versa. Naciśnięcie klawisza Wstecz przy włączonym C2 powoduje powrót do C1, z odwróconą animacją i wszystko jest w porządku.

ALE

przypadku wybrania opcji A lub B1 z SlidingMenu i popBackStack(), aby pozbyć C1 z tylnego stosie, to ślizga C2 się w prawo, który wygląda dziwnie. Chciałbym wyczyścić tylny stos bez uruchamiania animacji, ale nie mogę znaleźć sposobu, aby to zrobić. Próbowałem już wywoływać popBackStackImmediate() zamiast tego, ale to nie robi żadnej różnicy.

Jako alternatywa, mogę w ogóle uniknąć wywoływania funkcji addToBackStack, a zamiast tego ręcznie obsłużyć użytkownika, naciskając klawisz Back za pomocą Activity.onBackPressed(), ale być może istnieje rozwiązanie, którego po prostu nie widzę?

Odpowiedz

6

Mógłbyś spróbować naśladowania, choć jestem zaznajomiony z .remove() wydaje się, że powinien zrobić to, co chcesz:

myFragmentClass myFragC1 = (myFragmentClass) getFragmentManager().findFragmentByTag("theTagYouUsedWhenAddingToBackStack"); 
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
transaction.remove(myFragC1); 
transaction.commit(); 
+0

To wydaje się robić dokładnie to, czego potrzebuję. Dzięki! –

+0

@ JonathanCaryl Great! Cieszę się, że zadziałało, ponieważ nie byłem w 100% pewny, że to zrobi :) – TronicZomB

+0

Nie działa dla mnie z biblioteką wsparcia v23.1.1 –

3

Niestety, nie wiem jak to zrobić poprawnie, tak tutaj jest moje rozwiązanie (faktycznie mam zupełnie inny zmodyfikowany stackoverflow answer)

W klasie fragment bazowy, który jest rozszerzony o wszystkich innych fragmentów):

public static boolean sDisableExitAnimation = false; 

@Override 
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { 
    if (sDisableExitAnimation && !enter) { 
     return AnimationUtils.loadAnimation(getActivity(), R.anim.clear_stack_exit); 
    } 
    return super.onCreateAnimation(transit, enter, nextAnim); 
} 

Aby usunąć stos trzeba zadzwonić:

ScreenFragment.sDisableExitAnimation = true; 
manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 

i wreszcie clear_stack_exit sama animacja (nie znaleźć sposób, aby dostać go od samego FragmentManager):

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 

    <alpha 
     android:fromAlpha="1" 
     android:toAlpha="0" 
     android:duration="220" 
     /> 

    <scale 
     android:fromXScale="1" 
     android:toXScale="0.975" 
     android:fromYScale="1" 
     android:toYScale="0.975" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:duration="220" 
     /> 

</set> 

ten sposób” Mam poprawną przejrzystą animację stosu. Po prostu nie zapomnij wyczyścić zmiennej sDisableExitAnimation przed rozpoczęciem następnego przejścia.

+0

Dziękuję bardzo, działa niesamowicie –