在我的应用程序中,我有以下架构:

MainActivity
|_ FirstFragment
|   |_ GridFragment
|   |_ MapFragment
|
|_ SecondFragment
|
|_ ThirdFragment

请注意:
MainActivity正在使用ActionBarSherlockSlidingMenu
SlidingMenu在片段之间切换(FirstFragmentSecondFragmentThirdFragment)。
FirstFragment在操作栏中创建一个按钮,以在网格和地图模式之间切换。这是,在其子分区之间切换。
我想达到的目标
我需要片段在它们之间切换时保持其状态。也就是说,如果我在FirstFragment中,然后选择地图模式(showMapFragmentsubfragment),然后从幻灯片菜单中选择另一个选项并返回,我将再次看到地图。现在,当从幻灯片菜单中选择片段时,它正在重置每个片段。
这并不奇怪,因为在按下菜单选项时,我正在用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/

10-09 15:59