如何同时使用Android.App.Fragment和Support V4库

时间:2014-11-04 10:52:08

标签: android android-fragments android-animation android-support-library android-5.0-lollipop

我想使用支持库将新的L风格的ActionBar添加到我的应用程序中。所以我将活动改为ActionBarActivity。现在我有getFragmentManager()getSupportFragmentManager()

我使用getFragmentManager()处理片段并将它们渲染好。 但是当我向Backstack添加事务时出现问题((mTransaction.addToBackStack("blabla")))。 Backstack保持为空,因此如果我调用mTransaction.commit()并且getFragmentManager().getBackStackEntryCount()之后,无论我提交多少事务,后者都将返回0。因此,我的应用程序将在第一次“bacK”按下时关闭,而不导航到之前的片段。

为什么我不使用支持库中的碎片? 应用程序针对API 15及更新版本,所以我不关心< 11并且有很多代码需要迁移。此外,如果使用支持库,我将无法使用objectAnimator进行转换。这不是灾难,但我只是不想降低应用程序的一部分以改善另一部分。

所以问题是 - 是否可以修复堆栈,或者我应该将所有与片段相关的代码迁移到support-v4?

2 个答案:

答案 0 :(得分:1)

编辑:在仔细阅读您的问题之前,我发帖太快了。 我查看了FragmentActivityActivity的源代码,如果使用ActionBarActivity,我强烈建议您使用getSupportFragmentManager()。 原因是FragmentManager实现mFragments在FragmentActivity中被遮蔽,并在整个活动生命周期中使用。如果使用getFragmentManager(),将访问超类实现。而且您将不得不依赖FragmentActivity在适当的时间进行超级调用,否则生命周期可能会搞砸。使用onBackPressed(),您已经发现了FragmentActivity无法调用super的情况。

另一种解决方案是迁移到Toolbar。但是你放弃了ActionBarActivity的一些好东西,例如widget-tinting和ChildFragmentManager。

我只是坚持支持实施。

这是原始答案,并不适用于此处:

  

提交片段事务,不会立即添加/替换您的片段。因此你的后台仍然是空的。如果确实有必要,可以致电getFragmentManager().executePendingTransactions()

     

顺便说一下:为什么使用支持库会阻止您使用ObjectAnimator?

答案 1 :(得分:0)

好的,经过几次测试后,我发现实际上后面的堆栈已经填满了,但它并没有被活动处理。 添加以下代码解决了我的问题,但我想保持这个问题是开放的,因为我仍然不知道为什么内部ActionBarACtivity没有处理它,因为它在Activity中完成了

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();

    }
}