2013-04-26 62 views
9

我們有一個Activity包含一個SlidingMenu(https://github.com/jfeinstein10/SlidingMenu),其中有三個選項,我們稱它們爲A,B1,C1。這些對應於我們在活動中顯示的片段。當您從SlidingMenu中選擇不同的選項時,我將通過FragmentManager將當前片段替換爲新片段。清除Android Fragment沒有彈出的背堆棧?

從片段B1你可以去其他兩個,我們稱他們爲B2和B3。這裏我們需要Back鍵帶你從B2-> B1或者B3-> B1,所以我調用了transaction.addToBackStack(null)。如果我們在B2或B3上從SlidingMenu中選擇一個選項,我們希望清除後退堆棧,因此我使用此問題Clear back stack using fragments中建議的代碼,該代碼調用popBackStack()直到它清除。

到目前爲止這麼好。

從片段C1,你可以去片段C2。作爲C1/C2比較主/明細設計我使用

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

添加幻燈片動畫其中C1滑出,以左側爲C2從右邊滑動,反之亦然。在C2上按下後退鍵使我們回到C1,並帶有相反的動畫,而且都很好。

如果選擇從SlidingMenu A或B1和我們popBackStack()來獲取從後面堆擺脫C1的,那麼它的幻燈片C2出來的權利,這看起來很奇怪。我想要做的是在不運行動畫的情況下清除背面堆棧,但我找不到這樣做的方法。我試着調用popBackStackImmediate()來代替,但這似乎沒有任何區別。

作爲一種替代方案,我想我可以避免調用addToBackStack,而是通過Activity.onBackPressed()手動處理用戶按下後退鍵,但也許有一種解決方案我只是看不到?

回答

6

你可以嘗試如下,雖然我不熟悉.remove()似乎它應該做你想要什麼:

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

這似乎正是我所需要的。謝謝! – 2013-04-26 13:06:33

+0

@JonathanCaryl太棒了!我很高興它的工作,因爲我真的不是100%肯定會這樣:) – TronicZomB 2013-04-26 13:07:24

+0

不支持我的支持庫v23.1.1 – 2015-12-21 16:10:47

3

可悲的是,我不知道如何正確地做它所以這裏是我的解決辦法(實際上我已經相當改性其他計算器answer

在鹼基的片段類被所有其它片段延長):

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

要清除棧,你需要撥打:

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

最後clear_stack_exit動畫本身(我沒有找到一個方法來從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> 

這樣你」將有正確的清晰堆棧動畫。在開始下一個轉換之前,請不要忘記清除sDisableExitAnimation變量。

+0

非常感謝你,它的工作很棒 – 2013-11-12 07:55:36