Ошибка ориентации двухпанельного фрагмента Android: строка двоичного XML-файла #7: ошибка надувания фрагмента класса

У меня есть действие, которое переключается между двойной панелью и одной панелью в зависимости от ориентации с фрагментом списка и фрагментом представления сведений

т.е. портрет: одиночная панель = фрагмент списка / фрагмент детали (когда элемент выбран)

Пейзаж: двойная панель = фрагмент списка и фрагмент детали

Я получаю вышеуказанную ошибку для следующего варианта использования:

  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>

Ландшафтная активность_основная.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();
}
...

1 ответ

Решение

Я не мог найти решение точной проблемы. Но я где-то читал, что смешивание фрагментов, определенных в макете 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>

Ландшафтная активность_основная.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(). Один добавляет фрагмент списка в заполнитель списка, а другой добавляет фрагмент сведений в заполнитель сведений (если это двойная панель).

Другие вопросы по тегам