在我目前的应用程序中,我使用了两个片段。他们的定位如下:
纵向视图
|F1|
|--|
|F2|
并在横向视图中:
|F2|F1|
其中: F1是地图片段 F2是列表片段
布局具有相同的名称,并放置在两个文件夹中:layout
和layout-land
。
我在活动onCreate()
方法中设置我的片段:
private void displayFragment(int position) {
Fragment fragment = null;
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
switch (position) {
case MAIN_FRAGMNET:
fragment = fragmentManager.findFragmentByTag(String
.valueOf(position));
if (fragment == null) {
fragment = new MainListFragment();
}
break;
case MAP_FRAGMENT:
fragment = fragmentManager.findFragmentByTag(String
.valueOf(position));
if (fragment == null) {
fragment = new EMapFragment();
}
break;
default:
break;
}
if (fragment != null) {
if (fragment instanceof EMapFragment) {
fragmentTransaction.add(R.id.mapContainer, fragment);
} else {
setSelection(position);
fragmentTransaction.add(R.id.listContainer, fragment);
}
fragmentTransaction.commit();
}
}
并在onCreate()
displayFragment(MAP_FRAGMENT);
displayFragment(MAIN_FRAGMNET);
根据有关轮换活动的文档,重新创建生命周期。所以一切都应该完成,因为它将作为一个新的应用程序打开。但是,它不是。
每次旋转设备时,片段都会重复 - ActionBar
菜单中的选项会重复,第二个列表会尝试加载 - 这只显示初始布局消息,但加载器不是第二次开始。
第一个(初始)列表仍然可见。
有人可以建议我在这做错了什么吗?我希望片段总是单一的,所以当旋转时,一切都是重建的。
答案 0 :(得分:5)
仅当传入displayFragment()
为空时才调用onCreate()
回调中的Bundle
方法,这意味着Activity
未重新创建(如果{{1}重新创建,然后系统可以使片段可用)。然后在您的两个布局中,只需更改两个片段容器的位置以匹配所需的设计。具有这两种布局的系统将负责正确地重建两个片段并将它们放入容器中。