【问题标题】:Fragment not displayed after screen rotation屏幕旋转后不显示片段
【发布时间】:2016-03-02 20:28:02
【问题描述】:

我有一个活动,ActivityA,和 3 个片段,FragmentAFragmentBFragmentC

要添加 FragmentA,我使用replace,其中fragmentFragmentA 的新实例:

getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.frame_layout_fragment, fragment)
        .commit();

在ActivityA的onCreate方法中,我检查FragmentA的创建:

if (savedInstanceState == null) {
    FragmentA fragmentA = FragmentA.newInstance();

    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.frame_layout_fragment, fragmentA)
            .commit();
}

要添加FragmentBFragmentC,我使用addaddToBackStack,其中fragmentFragmentBFragmentC 的新实例:

getSupportFragmentManager()
        .beginTransaction()
        .add(R.id.frame_layout_fragment, fragment)
        .addToBackStack(null)
        .commit();

我在FragmentC 上按下后退按钮,它显示FragmentB,在FragmentB 上按下后退按钮显示FragmentA,正如预期的那样。当我在FragmentC 上时,我旋转了设备,FragmentC 仍然按预期显示。

但是,当我使用 2 次后退按钮从 FragmentC 导航到 FragmentA 时,然后旋转设备两次,纵向 -> 横向 -> 纵向,添加 FragmentB,添加 FragmentC,然后我旋转设备一次,我希望 FragmentC 显示,但 FragmentB 显示。当我按一次后退按钮时,什么也没有发生。当我再次按下它时,它会导航回FragmentA。似乎FragmentC 出现在后台堆栈中,但由于某种原因它不可见。

为什么FragmentC 在这种情况下不可见?

【问题讨论】:

  • 有人解决了这个问题吗?

标签: android android-fragments screen-rotation


【解决方案1】:

我认为另一个问题的答案也是你的答案:Difference between add(), replace(), and addToBackStack()

上面写着:

add 和 replace 的另一个重要区别是:replace 删除现有片段并添加新片段。这意味着当 您按下后退按钮,将创建被替换的片段 其 onCreateView 被调用。而 add 保留现有的 片段并添加一个新片段,这意味着现有片段将 活动并且它们不会处于“暂停”状态,因此当返回按钮时 不为现有片段调用按下 onCreateView( 在添加新片段之前存在的片段)。按照 fragment的生命周期事件onPause、onResume、onCreateView等 在替换的情况下将调用生命周期事件,但它们不会 在添加的情况下调用。

【讨论】:

  • 在我的情况下,旋转设备会为每个片段调用 onCreateView。即使调用了 onCreateView,FragmentC 也没有显示。
猜你喜欢
  • 2017-02-04
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多