14

Oto sytuacja:Android Fragment animacji onResume

Używam fragment dziecka wprowadzonego z API 17. powiedzmy mam

ActivityA -> FragmentA 
ActivityA -> FragmentB 

FragmentA -> ChildFragmentA 
FragmentA -> ChildFragmentB 

Więc jestem na ActivityA->FragmentA->ChildFragmentA i przejście do ActivityA->FragmentA->ChildFragmentB z FragmentTransaction używanie animacji do dodawania do backstacku i otwierania backstacku (po przejściu do ChildFragmentB i animacji po naciśnięciu i przejściu do ChildFragmentA jest animacja).

Teraz nawiguję do ActivityA->FragmentB (FragmentA nie jest długo przywiązany). Gdy przejdę z powrotem do ActivityA->FragmentA, gdzie ChildFragmentB jest widoczny, ChildFragmentB animuje się tak, jak miało to miejsce po przejściu z ChildFragmentA.

Chcę wyłączyć tę animację po wznowieniu . Ale trzymaj go, przechodząc między fragmentami dzieci. Ta animacja jest ustawiona w FragmentTransaction. Czy jest jakiś sposób, aby to się stało?

+1

Czy próbowałeś utrzymując wartość których działalność lub fragment idziesz zi ustawiania fragmenttransaction odpowiednio? Jak 'ft.setCustomAnimations (FragmentTransaction.TRANSIT_NONE, FragmentTransaction.TRANSIT_NONE);' gdy nie chcesz żadnego przejścia. Nie jestem pewien, gdzie określasz swoją FragmentTransaction, więc nie wiem, czy to działa dla ciebie. – SvenT23

Odpowiedz

0

Spróbuj wyłączyć onAttach przejściowego w ActivityA-> Fragmenta i włączyć go ponownie onResume w ChildFragments zarówno Fragmenta i B

3

I rozwiązać to poprzez dodanie pewnej logiki fragmentowi macierzystego w celu wykrycia, kiedy jest być ukryte lub pokazane i wyraźnie wyłączyć lub włączyć animacje w swoim podrzędnym.

@Override 
public void onPause() { 
    super.onPause(); 
    // If this fragment is being closed/replaced then disable animations 
    // in child fragments. Otherwise we get very nasty visual effects 
    // with the parent and child animations running simultaneously 
    ChildFragment f = (ChildFragment) getChildFragmentManager() 
             .findFragmentByTag(FRAGMENT_CHILD); 
    if (f != null) { 
     f.disableAnimations(); 
    } 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    // if this fragment is being opened then re-enable animations 
    // in child fragments 
    ChildFragment f = (ChildFragment) getChildFragmentManager() 
             .findFragmentByTag(FRAGMENT_CHILD); 
    if (f != null) { 
     f.enableAnimations(); 
    } 
} 

W części potomnej musimy wdrożyć te metody, aby włączyć/wyłączyć animacje. Robimy to, przesyłając onCreateAnimation() i używając animacji statycznej (R.anim.hold) w przypadku, gdy animacje powinny być wyłączone.

private boolean mDisableAnimations; 

void disableAnimations() { 
    mDisableAnimations = true; 
} 

void enableAnimations() { 
    mDisableAnimations = false; 
} 

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

Animacja statyczny zdefiniowany jest w res/anim/hold.xml jak:

<?xml version="1.0" encoding="utf-8"?> 
<translate 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:fromXDelta="0" 
    android:toXDelta="0" 
    android:duration="2000" />