我有一个应用程序在给定时间运行具有多个 (2) 片段的单个活动。我在左侧有一个片段,它用作在右侧显示哪个片段的菜单。
例如,菜单由不同的运动组成;足球、篮球、棒球、滑雪等。当用户选择一项运动时,右侧会显示一个包含特定运动详细信息的片段。
我已经将我的应用程序设置为在 layout-large 和 layout-small-landscape 中一次显示两个片段。然而,在 layout-small-portrait 中,在给定时间只显示一个片段。
想象一下;用户正在 layout-small-landscape 中浏览应用程序(一次两个片段)并选择一项运动,Football。在他选择篮球后不久。如果他现在选择旋转到 layout-small-portrait (一次一个片段),我希望发生以下情况:
篮球片段应该是可见的,但是如果他按下后退按钮,他应该返回菜单而不是足球片段(!),默认情况下是返回堆栈中的前一个片段。
我目前已经解决了这个问题,如下所示:
....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// static fragments
if(menuFragment == null) menuFragment = new MenuFragment();
if(baseFragment == null) baseFragment = new TimerFragment(); // default content fragment
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// Determine what layout we're in..
if(app().getLayoutBehavior(this) == LayoutBehavior.SINGLE_FRAGMENT) {
// We are currently in single fragment mode
if(savedInstanceState != null) {
if(!rotateFromSingleToDual) {
// We just changed orientation from dual fragments to single fragment!
// Clear the entire fragment back stack
for(int i=0;i<getSupportFragmentManager().getBackStackEntryCount();i++) {
getSupportFragmentManager().popBackStack();
}
ft.replace(R.id.fragmentOne, menuFragment); // Add menu fragment at the bottom of the stack
ft.replace(R.id.fragmentOne, baseFragment);
ft.addToBackStack(null);
ft.commit();
}
rotateFromSingleToDual = true;
return;
}
rotateFromSingleToDual = true;
ft.replace(R.id.fragmentOne, menuFragment);
} else if(app().getLayoutBehavior(this) == LayoutBehavior.DUAL_FRAGMENTS) {
// We are now in dual fragments mode
if(savedInstanceState != null) {
if(rotateFromSingleToDual) {
// We just changed orientation from single fragment to dual fragments!
ft.replace(R.id.fragmentOne, menuFragment);
ft.replace(R.id.fragmentTwo, baseFragment);
ft.commit();
}
rotateFromSingleToDual = false;
return;
}
rotateFromSingleToDual = false;
ft.replace(R.id.fragmentOne, menuFragment);
ft.replace(R.id.fragmentTwo, baseFragment);
}
ft.commit();
}
这是有效的,至少有时是这样。但是,很多时候我得到 java.lang.IllegalStateException: Fragment already added: MenuFragment (....)
谁能给我一些关于如何更好地实现这一点的指示?我当前的代码一点也不漂亮,我相信很多开发人员都想实现这一点。
提前致谢!