edr*_*ian 14 android android-fragments fragmentmanager android-nested-fragment
我正在使用Fragments实现菜单导航.所以我从Home开始,然后用户可以导航到每个部分的不同部分和细节.
当用户更改部分时,我会在fragmentmanager backstack上调用pop,直到我到达Home,然后加载新部分.
这一切都按预期工作.但是我遇到了这个问题:
我已经迭代了backstack并打印了每个片段,并且它不是菜单中的片段.
我在onResume()方法上放了一个调试标记(setHasOptionsMenu(true)
标记的地方),它确实进入了这里,所以片段它仍然在某处.
我想知道我做错了什么,我怎么能解决它,谢谢
更新:
我正在使用此代码加载新片段
fm.beginTransaction()
.add(container, sectionFragment.getFragment())
.addToBackStack(sectionFragment.getFragmentName())
.commit();
Run Code Online (Sandbox Code Playgroud)
并删除:
private void clearStack(){
int count = fm.getBackStackEntryCount();
while(count > 1){
fm.popBackStack();
count--;
}
}
Run Code Online (Sandbox Code Playgroud)
注1:我正在使用add而不是替换,因为当我从详细信息部分导航回来时,我不想丢失我的片段的状态.当我加载另一个不同的部分,然后我调用clearStack将堆栈弹出到1,然后加载新的片段.最后,我调用executePendingTransactions()来完成从事务中删除片段.
注2:我看到它正在我的片段onDestroy()方法上进入,所以它被摧毁了.但我不知道为什么在Main活动恢复时会再次调用它.
edr*_*ian 22
我发现问题不在于添加和删除堆栈片段的逻辑.
问题是一些片段在其中加载了另一个片段(它有ViewPager组件).然后我想,当片段被移除后,这些片段也被移除了.
仅在使用getChildFragmentManager()
方法时才是这样.在其他碎片中加载碎片时必须使用此方法.如果不是,则将片段与片段活性相关联.
我发现了这个问题,因为在打电话之后
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Run Code Online (Sandbox Code Playgroud)
此代码fragmentManager.getFragments().size()
返回堆栈中的最大碎片数量.我检查了null上的每个片段.我发现一些片段在我的情况下是空的.也许它对某人有帮助)
popBackStack
只会恢复您的最后一个FragmentTransaction
。
如果您使用FragmentTransaction.add
,popBackStack
只会致电FragmentTransacetion.remove
。
但是,如果您致电FragmentTransaction.replace
,popBackStack
将会致电FragmentTransaction.remove
和FragmentTransaction.add
对于您的“ NOTE 1”:
FragmentTransaction.replace
将不会更改片段状态。
归档时间: |
|
查看次数: |
30367 次 |
最近记录: |