0

リストフラグメントと詳細ビューフラグメントの向きに応じて、デュアルペインとシングルペインを切り替えるアクティビティがあります

すなわち、Portrait: Single Pane = リスト フラグメント / 詳細フラグメント (項目が選択されている場合)

横: デュアル ペイン = リスト フラグメントと詳細フラグメント

次の使用例で上記のエラーが発生します。

  1. 縦長の単一ペインのリストで、アイテムをクリックして詳細フラグメントを起動します
  2. 画面を横向きに回転
  3. 例外!

何が問題なのかわかりません..何人かの人々が同様の問題を抱えているようですが、まったく同じかどうかはわかりません。

ここにいくつかのコードがあります:

デフォルトの activity_main.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="com.example.MyListFragment"
        android:id="@+id/myListFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>

ランドスケープ activity_main.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="com.example.MyListFragment"
        android:id="@+id/myListFragment"
        android:layout_weight="1"
        android:layout_width="0px"
        android:layout_height="match_parent"/>

    <FrameLayout android:id="@+id/myDetailsLayout"
        android:layout_weight="1"
        android:layout_width="0px"
        android:layout_height="match_parent" />
 </LinearLayout>

MainActivity.Java で:

....
@Override
public void onMyItemSelected(DetailsItem item) {    

    Fragment newDetailFragment = new MyDetailFragment();
    Bundle bundle = new Bundle();
    bundle.putParcelable("details", item);
    newDetailFragment.setArguments(bundle);

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();

    if (dualPane){
        ft.replace(R.id.myDetailsLayout, newDetailFragment);
    }
    else {
        ft.replace(R.id.myListFragment, newDetailFragment);
    }
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
    .addToBackStack(null)
    .commit();
}
...
4

1 に答える 1

0

正確な問題の解決策を見つけることができませんでした。しかし、レイアウト xml で定義されたフラグメントと実行時に動的にロードされるフラグメントを混在させると、多くの問題が発生する可能性があることをどこかで読んでいました。

そこで、この問題を解決するために、フレーム レイアウト プレースホルダーのみが含まれるように (つまり、フラグメントが含まれないように) レイアウトを変更しました。次に、実行時にプレースホルダーを実際のフラグメントに動的に置き換えます。

私のレイアウトは次のようになります。

デフォルトの activity_main.xml:

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

ランドスケープ activity_main.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" >

    <FrameLayout
        android:id="@+id/myListFragment"
        android:layout_weight="1"
        android:layout_width="0px"
        android:layout_height="match_parent"/>

    <FrameLayout android:id="@+id/myDetailsLayout"
        android:layout_weight="1"
        android:layout_width="0px"
        android:layout_height="match_parent" />
</LinearLayout>

そして今、OnCreate() で呼び出されたアクティビティに 2 つの関数があります。1 つはリスト フラグメントをリスト プレースホルダーに追加し、もう 1 つは詳細フラグメントを詳細プレースホルダーに追加します (デュアル ペインの場合)。

于 2013-05-23T11:51:06.643 に答える