我想使用支持库将新的L风格的ActionBar添加到我的应用程序中。所以我将活动改为ActionBarActivity
。现在我有getFragmentManager()
和getSupportFragmentManager()
。
我使用getFragmentManager()
处理片段并将它们渲染好。
但是当我向Backstack添加事务时出现问题((mTransaction.addToBackStack("blabla"))
)。 Backstack保持为空,因此如果我调用mTransaction.commit()
并且getFragmentManager().getBackStackEntryCount()
之后,无论我提交多少事务,后者都将返回0。因此,我的应用程序将在第一次“bacK”按下时关闭,而不导航到之前的片段。
为什么我不使用支持库中的碎片?
应用程序针对API 15及更新版本,所以我不关心< 11并且有很多代码需要迁移。此外,如果使用支持库,我将无法使用objectAnimator
进行转换。这不是灾难,但我只是不想降低应用程序的一部分以改善另一部分。
所以问题是 - 是否可以修复堆栈,或者我应该将所有与片段相关的代码迁移到support-v4?
答案 0 :(得分:1)
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();
}
}