2

横向きと縦向きの異なるレイアウト間の向きの変更は簡単なようですが、現在の状況に対する解決策を見つけることができません。

ランドスケープモードで2つのフラグメントを持つデュアルペインレイアウトを使用したい

res \ layout-land \ dashboard_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <fragment class="xxx.DashboardFragment"
            android:id="@+id/master_frag"
            android:layout_width="@dimen/timeline_size"
            android:layout_height="match_parent"/>

    <fragment class="xxx.TaskInstanceFragment"
            android:id="@+id/details_frag"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</LinearLayout>

ポートレートモードの単一ペインレイアウト

res \ layout \ Dashboard_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <fragment class="xxx.DashboardFragment"
        android:id="@+id/master_frag"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</FrameLayout>

DashboardFragmentはViewPagerで構成されていることに注意してください。それが重要かどうかわからない。

ここで、向きを横向き(デュアル)から縦向き(シングル)に変更すると、を更新する必要があるため、アプリがクラッシュしdetails_fragます。縦向きでアクティビティを開始すると機能しますが、横向きから縦向きに切り替えるだけで問題が発生します。

アクティビティには、次のコードがあります。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dashboard_activity);

    Fragment frag = getSupportFragmentManager().findFragmentById(R.id.details_frag);
    mDualFragments = frag != null;

    /* .. */
}

これで、FragmentManagerポートレートモードに切り替えたときに、まだ詳細フラグメントが検出されるため、mDualFragmentstrueですが、falseである必要があります。これにより、後で詳細フラグメント内のメソッドが呼び出されます。

それで、これはなぜですか?:)

よろしく、Konsumierer

4

1 に答える 1

5

findFragmentById現在のレイアウトのフラグメントを返すだけでなく、以前に表示されたフラグメントも返すためです。代わりにこれを試してください:

mDualFragments = frag != null && frag.isInLayout();
于 2012-09-12T15:18:29.367 に答える