这是负责向后台堆栈添加片段的函数:
public void populateContent(File f)
{
ContentFragment cf = new ContentFragment(ctx, ac, this);
FragmentTransaction transaction = ac.getSupportFragmentManager().beginTransaction();;
cf.updateView(f);
transaction.replace(R.id.contentFragment, cf);
transaction.addToBackStack(null);
transaction.commit();
}
单击后退按钮时,最后一个片段无法加载(没有任何反应)。
知道可能导致这种情况的原因吗?
编辑:FragmentManager日志。
在我看来好像我的应用程序正在保存第二个视图两次,而不是保存第一个视图然后保存第二个视图。
答案 0 :(得分:54)
似乎在片段事务上调用addToBackStack()是不够的,我们必须在我们自己按下的Back按钮上处理后备栈的弹出。我将此添加到我的活动中,它按预期工作:
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0 ){
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
答案 1 :(得分:12)
我不确定实际的解决方案,但我可以指导你一点,也许你可以弄清问题是什么。
你真的在替换两个片段吗?如果不这样做,则没有要还原的事务。您是第一个从XML添加的Fragment
吗?管理员不会知道这个片段,您可能还需要使用事务添加第一个Fragment
。
请务必检查if (savedInstanceState == null) performFirstTransaction()
,否则您最终会添加第一个Fragment
两次。
一个好主意是在enableDebugLogging
中使用FragmentManager
。这将告诉您经理知道哪些片段。
看到这个: http://developer.android.com/reference/android/app/FragmentManager.html#enableDebugLogging(boolean)
作为旁注,建议不要为Fragment
使用自定义构造函数。这是因为如果您的应用程序被操作系统杀死并重新实例化,它将调用空构造函数。
您应该使用ContentFragment.getInstance(<params>)
之类的静态方法来创建Fragment
。
请在“课程概述”部分的http://developer.android.com/reference/android/app/Fragment.html查看更多信息。
我希望我的回答可以帮助你找到问题。
答案 2 :(得分:2)
我正在添加,而不是替换,但我必须在add()之前调用addToBackStack(null),而不是在将关闭的片段之后调用addToBackStack(null),而不是在将保持打开的片段上。
在A级(首先打开)
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.layout_a, f, Constants.FRAGMENT_KEY);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
在B班(由A班开设)
FragmentTransaction ft = fm.beginTransaction();
ft.addToBackStack(null);
ft.add(R.id.layout_b, f, Constants.FRAGMENT_KEY);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();