方向更改时看不到碎片

时间:2015-04-04 02:51:21

标签: android android-fragments fragment android-fragmentactivity

在以下代码中,片段正在从布局xml动态膨胀。我面临的问题是,当我旋转设备时,我看不到碎片。

如果我查看fragmentManager,我确实看到片段在那里。它们被添加并附加,但屏幕上没有。

MenuCard extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.content);

        leftContainer = (FrameLayout) findViewById(R.id.leftContainer);
        rightContainer = (FrameLayout) findViewById(R.id.rightContainer);


        Fragment fragment = mFragmentManager.findFragmentById(R.id.leftFragment);
        if (fragment == null) {
            LayoutInflater.from(this).inflate(R.layout.left_fragment, leftContainer);
        }

        fragment = mFragmentManager.findFragmentById(R.id.rightFragment);
        if (fragment == null) {
            LayoutInflater.from(this).inflate(R.layout.right_fragment, rightContainer);
                }
            }
        }
    }

}

R.layout.left_fragment

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/leftFragment"
    android:name="com.example.LeftFragment"
    tools:layout="@layout/left_fragment">

</fragment>

R.layout.right_fragment

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rightFragment"
    android:name="com.example.LeftFragment"
    tools:layout="@layout/left_fragment">

</fragment>

添加R.layout.content的代码

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SlidingPaneLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spl"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/leftContainer"
        android:layout_width="320dp"
        android:layout_height="match_parent"
        android:background="#00AFF0"
        />

    <FrameLayout
        android:id="@+id/rightContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</android.support.v4.widget.SlidingPaneLayout>

3 个答案:

答案 0 :(得分:0)

您可以尝试在清单中的片段活动声明中添加以下行:

android:configChanges="screenSize|orientation" 

这将阻止onCreate在屏幕方向上更改。对于方向更改的处理,您可以覆盖onConfigurationChanges。

答案 1 :(得分:0)

因此,经过对片段管理器代码的大量阅读后,我遇到了这些神奇的界限:

// For fragments that are created from a layout, when restoring from
// state we don't want to allow them to be created until they are
// being reloaded from the layout.

这意味着我案例的正确代码是

@覆盖     protected void onCreate(Bundle savedInstanceState){         super.onCreate(savedInstanceState);

    setContentView(R.layout.content);

    leftContainer = (FrameLayout) findViewById(R.id.leftContainer);
    rightContainer = (FrameLayout) findViewById(R.id.rightContainer);

    LayoutInflater.from(this).inflate(R.layout.left_fragment, leftContainer);
    LayoutInflater.from(this).inflate(R.layout.right_fragment, rightContainer);


    }
}

SupportFragmentManager将在方向更改时重复使用片段,并且只会使布局膨胀。

答案 2 :(得分:0)

我从未尝试过你的设计,但我发现它很有趣。虽然我不推荐它。

由于方向已更改,因此不会重新创建UI。这是因为未重新创建活动,因此在更改方向时不会触发onCreate。当屏幕因不同因素而发生变化时,会触发 onCreateView 。我从未在Activity子类中尝试过。它通常在Fragment子类中完成。实际上,onCreate仅在应用程序因用户操作或崩溃而停止时触发。

如果/当我在Activity中找到 onCreateView 方法的好样本时,我会发布它。