我对在单个活动之间切换两个片段的最佳方法感兴趣。
我已经阅读了15篇Stack Overflow帖子和5篇关于如何做到这一点的博客帖子,虽然我认为我拼凑了一个解决方案,但我不相信它是最好的。因此,我希望听到人们对正确处理此问题的看法,特别是关于父活动和片段的生命周期。
以下是详细情况:
除了一般的架构建议,我还有以下未解决的问题:
提前致谢!
答案 0 :(得分:7)
我最后使用支持片段管理器添加了两个片段,然后使用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();
}
答案 1 :(得分:2)
您可能需要考虑在父Activity中使用ViewPager
,以便在片段之间切换。
所以你可以滑过它们。
如果你想在会话期间保持他们的状态,即使父活动被销毁,你需要使它们Parcelable
,这样你就可以保存状态,即使那个时候没有实例化类。如果您旋转设备并希望将当前情况/数据保留在屏幕上,则还需要执行此操作。
您应该在Parcelable
方法中将它们写入onPause
,然后在onResume
个方法中重新创建它们。这样,由于设备方向的改变,它们是否被销毁或必须重新创建并不重要。
如果您希望能够使用Backbutton在这些片段之间切换,您可以抓住按钮点击onBackPressed
并相应地处理它。
如果你需要弄清楚你在特定时间显示的片段是什么,你问ViewPager
那时他正在展示什么片段,所以你不必跟踪,你可以问一个谁知道,如果你需要知道它。