9

我对在两个片段之间切换的单个活动的最佳方式感兴趣。

我可能已经阅读了 15 篇 Stack Overflow 帖子和 5 篇关于如何做到这一点的博客帖子,虽然我认为我拼凑了一个解决方案,但我不相信它是最好的。所以,我想听听人们对处理这个问题的正确方法的意见,特别是关于父活动和片段的生命周期。

以下是详细情况:

  1. 可以显示两个可能片段之一的父活动。
  2. 这两个片段具有我想在会话中持久化的状态,但不一定需要在会话之间持久化。
  3. 许多其他活动,例如父活动和片段可能被埋在后台堆栈中并由于内存不足而被破坏。
  4. 我希望能够使用后退按钮在片段之间移动(据我所知,我不能使用 setRetainInstance)。

除了一般的架构建议外,我还有以下悬而未决的问题:

  1. 如果父活动由于内存不足而被破坏,我如何保证两个片段的状态将被保留,根据这篇文章:当片段被替换并放入后堆栈(或删除)时,它是否留在内存中? . 我只需要一个指向父活动中每个片段的指针吗?
  2. 父活动跟踪它当前显示的片段的最佳方式是什么?

提前致谢!

4

2 回答 2

7

我最终使用支持片段管理器添加了两个片段,然后使用分离/附加在它们之间切换。我能够使用 commitAllowingStateLoss(),因为我在其他地方保留了视图的状态,并在 onResume() 中手动设置了正确的片段。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);    

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.my_layout, new AFragment(), TAG_A);
    fragmentTransaction.add(R.id.my_layout, new BFragment(), TAG_B);
    fragmentTransaction.commit();
}

public void onResume() {
    super.onResume();
    if (this.shouldShowA) {
        switchToA();
    } else {
        switchToB();
    }
}

private void switchToA() {
    AFragment fragA = (AFragment) getSupportFragmentManager().findFragmentByTag(TAG_A);
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.detach(getSupportFragmentManager().findFragmentByTag(TAG_B));
    fragmentTransaction.attach(fragA);
    fragmentTransaction.addToBackStack(null);

    fragmentTransaction.commitAllowingStateLoss();
    getSupportFragmentManager().executePendingTransactions();
}
于 2014-01-06T21:40:13.917 回答
2

您可能需要考虑ViewPager在您的父 Activity 中使用 a,以便您可以在 Fragment 之间切换。

因此,您将能够浏览它们。

如果您想在会话期间保持它们的状态,即使父活动被破坏,您需要制作它们Parcelable,这样即使当时没有实例化类,您也可以保存状态。如果您旋转设备并希望将当前情况/数据保留在屏幕上,您也需要执行此操作。

Parcelable您应该在他们的onPause方法中将它们写入 a并在onResume其中重新创建它们。这样,它们是否因设备方向的变化而被破坏或必须重新创建都没有关系。

如果您希望能够使用 Backbutton 在这些片段之间切换,您可以捕获 buttonClickonBackPressed并相应地处理它。

如果您需要弄清楚您在给定时间显示的 Fragment,您可以询问您ViewPager当时正在显示的 Fragment,这样您就不必跟踪,您可以询问知道的人,如果您需要知道它.

于 2013-09-25T23:47:13.467 回答