在我的应用程序中,我有以下架构:
MainActivity
|_ FirstFragment
| |_ GridFragment
| |_ MapFragment
|
|_ SecondFragment
|
|_ ThirdFragment
请注意:
MainActivity
正在使用ActionBarSherlock
和SlidingMenu
。SlidingMenu
在片段之间切换(FirstFragment
,SecondFragment
,ThirdFragment
)。FirstFragment
在操作栏中创建一个按钮,以在网格和地图模式之间切换。这是,在其子分区之间切换。我想达到的目标
我需要片段在它们之间切换时保持其状态。也就是说,如果我在
FirstFragment
中,然后选择地图模式(showMapFragment
subfragment),然后从幻灯片菜单中选择另一个选项并返回,我将再次看到地图。现在,当从幻灯片菜单中选择片段时,它正在重置每个片段。这并不奇怪,因为在按下菜单选项时,我正在用
new FirstFragment()
提交事务。然而,我第一次尝试将每个片段的引用引入到他的父元素中。例如,
MainActivity
有三个片段成员,在进行事务处理时,检查它们是否存在,并在必要时实例化。直到我添加了第二级片段,然后在提交事务时开始抛出异常(表示活动已被销毁)。正如你可能已经注意到的,我还远远不是一个android专家,需要一些关于这个话题的指导。
如何在没有每个片段的引用的情况下保存片段状态?
最佳答案
在发布问题之后,接下来我试图避免将片段保存在其容器中的局部变量中,并在任何给定时间使用FragmentManager.getFragmentByTag()
访问它们,但是问题仍然存在,因为FragmentTransaction.replace()
正在破坏片段。
我的解决方案
正如luksprog在评论中指出的那样,我必须手动管理所有片段。为了实现这一点,我必须回到我以前的方法,在那里我为每个片段都有局部变量。然后,MainActivity
执行以下操作:
实例化它的三个片段。
this.firstFragment = new FirstFragment();
this.secondFragment = new SecondFragment();
this.thirdFragment = new ThirdFragment();
附加三个片段,并隐藏除初始部分以外的所有片段。
getSupportFragmentManager()
.beginTransaction()
.add(R.id.content_frame, this.firstFragment)
.add(R.id.content_frame, this.secondFragment)
.add(R.id.content_frame, this.thirdFragment)
.hide(this.secondFragment)
.hide(this.thirdFragment)
.commit();
要切换内容,
SlideMenu
正在调用此函数:public void switchContent(Fragment newContent) {
if (newContent != null) {
getSupportFragmentManager()
.beginTransaction()
.detach(this.firstFragment)
.detach(this.secondFragment)
.detach(this.thirdFragment)
.attach(newContent)
.commit();
// Restore menu open gesture if map is not present
if (!(newContent instanceof firstFragment) && getSlidingMenu().getTouchModeAbove() != SlidingMenu.TOUCHMODE_FULLSCREEN)
getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
// Set menu open gesture if map is present
if (newContent instanceof firstFragment && firstFragment.currentFragment == FirstFragment.MAP_FRAGMENT)
getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
getSlidingMenu().showContent();
}
}
然后,具有子片段(
FirstFragment
)的片段执行相同的操作,但是:它使用
getChildFragmentManager()
而不是getSupportFragmentManager()
。它使用
show()
和hide()
替换内容,因为当使用detach()
和attach()
时,地图并没有保留它的坐标。关于android - 保留 fragment 状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16461483/