Ошибка ориентации двухпанельного фрагмента Android: строка двоичного XML-файла #7: ошибка надувания фрагмента класса
У меня есть действие, которое переключается между двойной панелью и одной панелью в зависимости от ориентации с фрагментом списка и фрагментом представления сведений
т.е. портрет: одиночная панель = фрагмент списка / фрагмент детали (когда элемент выбран)
Пейзаж: двойная панель = фрагмент списка и фрагмент детали
Я получаю вышеуказанную ошибку для следующего варианта использования:
- В портретном однопанельном списке нажмите на элемент, чтобы запустить фрагмент сведений
- Поверните экран в горизонтальное положение
- ИСКЛЮЧЕНИЕ!
Я не вижу, что происходит не так. Похоже, что у нескольких людей были похожие проблемы, но я не уверен, что они совершенно одинаковые.
Вот некоторый код:
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(). Один добавляет фрагмент списка в заполнитель списка, а другой добавляет фрагмент сведений в заполнитель сведений (если это двойная панель).