【问题标题】:Clear Android Fragment back stack without popping?清除Android Fragment回栈而不弹出?
【发布时间】:2013-04-26 12:08:44
【问题描述】:

我们有一个 Activity,其中包含一个 SlidingMenu (https://github.com/jfeinstein10/SlidingMenu),其中有三个选项,我们称它们为 A、B1、C1。这些对应于我们在活动中显示的片段。当您从 SlidingMenu 中选择不同的选项时,我会通过 FragmentManager 将当前片段替换为新片段。

您可以从片段 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 上按 Back 键将我们带回到 C1,并带有反向动画,一切都很好。

但是

如果您从 SlidingMenu 中选择 A 或 B1,然后我们 popBackStack() 将 C1 从后面的堆栈中删除,那么它会将 C2 滑到右侧,这看起来很奇怪。我想做的是在不运行动画的情况下清除后台堆栈,但我找不到这样做的方法。我尝试调用 popBackStackImmediate() 代替,但这似乎没有任何区别。

作为替代方案,我想我可以完全避免调用 addToBackStack,而是通过 Activity.onBackPressed() 手动处理用户按下返回键,但也许有一个我看不到的解决方案?

【问题讨论】:

    标签: android android-fragments slidingmenu


    【解决方案1】:

    您可以尝试以下操作,尽管我对.remove() 不熟悉,但它似乎应该满足您的需求:

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

    【讨论】:

    • 这似乎正是我所需要的。谢谢!
    • @JonathanCaryl 太好了!我很高兴它起作用了,因为我实际上并不是 100% 确定它会 :)
    • @YaroslavMytkalyk 支持 lib 其 getSupportFragmentManager() ?
    • @DerekBeattie 是的,这就是我用过的。当我删除片段,然后添加一个新片段时,按回仍然会导致上一个片段。
    • 但是我想这有一个问题,堆栈计数不会更新。
    【解决方案2】:

    遗憾的是,我不知道如何正确地做到这一点,所以这是我的解决方案(实际上我已经相当修改了其他 stackoverflow 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 变量。

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 2012-09-13
      • 2016-10-14
      • 1970-01-01
      • 2015-05-14
      • 2017-08-11
      相关资源
      最近更新 更多