0

我有一个活动,可以根据带有列表片段和详细信息视图片段的方向在双窗格和单窗格之间切换

即纵向:单窗格=列表片段/细节片段(当一个项目被选中时)

横向:双窗格 = 列表片段和细节片段

对于以下用例,我收到上述错误:

  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>

现在我的活动中有 2 个函数调用 OnCreate()。一个将列表片段添加到列表占位符,另一个将详细信息片段添加到详细信息占位符(如果它是双窗格)。

于 2013-05-23T11:51:06.643 回答