在两个片段之间切换的最佳方法

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

我已经阅读了大概15堆栈溢出的post和5篇博客文章如何做到这一点,而且,虽然我认为我拼凑了一个解决scheme,我不相信这是最好的。 所以,我想听取人们的意见,正确的处理方式,特别是关于父母活动和片段的生命周期。

详细情况如下:

  1. 父活动,可以显示两个可能的片段之一。
  2. 这两个片段的状态,我想坚持一个会议,但不一定需要坚持会议之间。
  3. 一些其他的活动,如父母的活动和碎片可能会被埋在背堆栈,并由于内存不足而被破坏。
  4. 我希望能够使用后退button在片段之间移动(据我所知,我不能使用setRetainInstance)。

除了一般的build筑build议外,我还有以下几个突出的问题:

  1. 如果由于内存不足而导致父活动被破坏,那么如何保证这两个片段的状态将被保留,如下所示: 当一个片段被replace并放入后退堆栈(或移除)时,它会留在内存中? 。 我只需要一个父指向每个片段的指针?
  2. 父母活动跟踪当前显示哪个片段的最好方法是什么?

提前致谢!

Solutions Collecting From Web of "在两个片段之间切换的最佳方法"

我最终使用支持片段pipe理器添加了两个片段,然后使用detach / attach在它们之间切换。 我能够使用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(); } 

您可能需要考虑在父活动中使用ViewPager ,以便在碎片之间切换。

所以你可以通过它们滑动。

如果要在会话期间保持其状态,即使父活动已被破坏,也需要将它们设置为Parcelable ,以便即使该类未在此时实例化,也可以保存该状态。 如果您旋转设备并且想要保持屏幕上的当前状况/数据,则还需要执行此操作。

你应该在onPause方法中将它们写入一个Parcelable中,然后在onResume重新创build它们。 这样,由于设备方向的改变,它们是否被破坏或者不得不被重新创build。

如果您希望能够使用Backbutton在这些片段之间进行切换,则可以捕获buttonClick for onBackPressed并相应地进行处理。

如果你需要弄清楚在给定的时间显示的是什么片段,你可以向ViewPager询问他当时显示的是什么片段,所以你不需要跟踪,你可以问一个知道的人,如果你需要知道它。