Android在屏幕旋转时复制片段

seb*_*123 2 android android-fragments

在我目前的应用程序中,我使用两个片段.它们的位置如下:

在纵向视图中

|F1|
|--|
|F2|
Run Code Online (Sandbox Code Playgroud)

在景观视图中:

|F2|F1|
Run Code Online (Sandbox Code Playgroud)

其中:F1是地图片段F2是列表片段

布局具有相同的名称,并放在两个文件夹中:layoutlayout-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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

并在 onCreate()

    displayFragment(MAP_FRAGMENT);
    displayFragment(MAIN_FRAGMNET);
Run Code Online (Sandbox Code Playgroud)

根据有关轮换活动的文档,重新创建生命周期.所以一切都应该完成,因为它将作为一个新的应用程序打开.但事实并非如此.

每当我旋转设备时,片段都会重复 - ActionBar菜单中的选项会重复,第二个列表会尝试加载 - 这只显示初始布局消息,但加载器不会再次启动.

第一个(初始)列表仍然可见.

有人可以建议我在这做错了什么吗?我希望片段总是单一的,所以当旋转时真的一切都是重建的.

Luk*_*rog 5

仅当传入的为null意味着没有重新创建时(如果重新创建,则系统将使片段可用)displayFragment(),则在onCreate()回调中调用该方法.然后在您的两个布局中,只需更改两个片段容器的位置以匹配所需的设计.具有这两种布局的系统将负责正确地重建两个片段并将它们放入容器中.BundleActivityActivity