Android恢复片段堆栈的顺序

5
我有两个活动,A和B。每个活动都是一个容器,其中包含通过FragmentTransaction替换的片段。
在某些设备上,存在一个问题,即当用户在活动A中打开活动B时,第一个活动可能已被销毁,这意味着当用户单击返回按钮时,它会使第一个活动重新创建,而在一般设备中,它只会恢复。
我的主要问题是用户失去了在第一个活动中所拥有的片段堆栈。当用户打开第二个活动时,他已经在第一个活动中深入了3个片段。如何恢复堆栈并将用户返回到第一个活动被销毁之前的点?

你可以搜索 setRetainInstance(true) 来获取有关恢复片段顺序的一些解决方案。 - saurabh dixit
@YonatanNir,我认为如果savedInstanceState != null,你应该什么都不做。在这种情况下,FragmentManager会适当地恢复状态。 - azizbekian
1
@azizbekian 如果我什么都不做,那么应用程序的“第一”片段将被显示,这只有在用户第一次打开应用程序时才应该显示。 - CodeMonkey
很有趣。将其加入书签以查看问题所在。 - azizbekian
只要活动被重新创建(不是第一次创建),FragmentManager 就会负责恢复先前的状态,但目前并没有发生。这就是我所说的“有趣”。 - azizbekian
显示剩余4条评论
1个回答

2
这应该由Android操作系统自动处理。您可以打开开发人员选项“不保留活动”,以始终模拟此行为(销毁您的活动),当您的活动进入后台时。之后,您可以开始调试。一些需要检查的事项:
  • 在活动的onCreate中,您是否使用savedInstanceState调用了super onCreate?

  • 如果您在onCreate的开头设置断点,当您“返回”到活动时,是否有保存的实例状态?

  • 您在哪里创建片段?您是否手动重新创建它们(不应该)?

  • 您的片段是硬编码在布局中还是替换在布局中(替换容器视图)?

* 编辑 *

从您的回复中我得出这是问题,您说:“在onCreate的最后,我正在使用片段事务替换片段,因此加载应用程序的第一个片段” => 当savedInstanceState不为空时,您不应该这样做。否则,您将破坏已经从保存的状态中存在的内容。

在这里查看:https://developer.android.com/training/basics/fragments/fragment-ui.html 注意当savedInstanceState不为空时的返回值。
public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news_articles);

        // Check that the activity is using the layout version with
        // the fragment_container FrameLayout
        if (findViewById(R.id.fragment_container) != null) {

            // However, if we're being restored from a previous state,
            // then we don't need to do anything and should return or else
            // we could end up with overlapping fragments.
            if (savedInstanceState != null) {
                return;
            }

            // Create a new Fragment to be placed in the activity layout
            HeadlinesFragment firstFragment = new HeadlinesFragment();

            // In case this activity was started with special instructions from an
            // Intent, pass the Intent's extras to the fragment as arguments
            firstFragment.setArguments(getIntent().getExtras());

            // Add the fragment to the 'fragment_container' FrameLayout
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, firstFragment).commit();
        }
    }
}

你所描述的情况似乎是第一个活动在此之前未被销毁而被恢复了。 onCreate会调用super。如果活动被销毁并且我回来了,保存的实例不是null。在onCreate的末尾,我使用片段事务替换片段,从而加载应用程序的第一个片段。我在一个容器视图中替换它们。 - CodeMonkey
在onCreate的最后,我使用片段事务替换片段,从而加载应用程序的第一个片段。但是,当savedInstanceState不为空时,您不应该这样做。否则,您将破坏已保存状态中存在的内容。请参阅:https://developer.android.com/training/basics/fragments/fragment-ui.html - Frank
好的,我已经创建了第一个片段,只有在savedinstance为空时才能工作。 - CodeMonkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接