14

這裏的情況是:Android的碎片動畫的onResume

我使用與API 17.說我有

ActivityA -> FragmentA 
ActivityA -> FragmentB 

FragmentA -> ChildFragmentA 
FragmentA -> ChildFragmentB 

所以我在ActivityA->FragmentA->ChildFragmentA和我有FragmentTransaction過渡到ActivityA->FragmentA->ChildFragmentB介紹孩子片段使用動畫添加到後臺堆棧並彈出後臺堆棧(當我前往ChildFragmentB時有一個動畫,而當我按下並移至ChildFragmentA時有一個動畫)。

現在我導航到ActivityA->FragmentB(FragmentA沒有長期附加)。當我回到ActivityA->FragmentA,其中ChildFragmentB是可見的,ChildFragmentB在動畫中,就像它來自ChildFragmentA時那樣。

我想在恢復時禁用此動畫。但是在兒童片段之間轉換時保留它。該動畫在FragmentTransaction中設置。有什麼辦法可以做到這一點嗎?

+1

你試過保持你來自哪個活動或片段,並相應地設置您的fragmenttransaction的價值?像'ft.setCustomAnimations(FragmentTransaction.TRANSIT_NONE,FragmentTransaction.TRANSIT_NONE);'當你不需要任何轉換時。我不確定你在哪裏指定你的FragmentTransaction,所以我不知道這是否適合你。 – SvenT23

回答

0

嘗試禁用過渡onAttach在ActivityA-> FragmentA和重新啓用它再次的onResume在兩個FragmentA的ChildFragments和B

3

我通過添加一些邏輯連接到母體片段解決了這個檢測,當它是被隱藏或顯示,並明確禁用或啓用其子中的動畫。

@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(); 
    } 
} 

在子片段中,我們需要實現這些方法來啓用/禁用動畫。我們通過重寫onCreateAnimation()並在動畫應該被禁用的情況下使用靜態動畫(R.anim.hold)來實現。

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); 
} 

靜態動畫定義res/anim/hold.xml爲:

<?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" />