Метод замены FragmentTransaction не работает должным образом
У меня ошибка с заменой фрагментов внутри FrameLayout
контейнер. Когда приложение запускается в первый раз, все в порядке, но когда я прячу приложение и затем возобновляю его, фрагменты начинают перекрывать друг друга, когда FragmentTransaction.replace
метод называется
Я видел почти все вопросы о таких проблемах, но не могу решить эту проблему.
Код:
<FrameLayout
android:id="@+id/frame"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
Добавить начальный фрагмент:
getSupportFragmentManager().beginTransaction()
.add(R.id.frame, RequestFragment.newInstance(), REQUEST_FRAGMENT_TAG)
.commit();
Заменить:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
switch (menuItem.getItemId()) {
case R.id.request:
ft.replace(R.id.frame, RequestFragment.newInstance(), REQUEST_FRAGMENT_TAG);
ft.commit();
return true;
case R.id.finished:
ft.replace(R.id.frame, FinishedFragment.newInstance(), FINISHED_FRAGMENT_TAG);
ft.commit();
return true;
case R.id.questions:
ft.replace(R.id.frame, QuestionsFragment.newInstance(), QUESTIONS_FRAGMENT_TAG);
ft.commit();
return true;
default:
return true;
}
4 ответа
Трудно сказать, поскольку ваш код не предоставляет контекста относительно того, когда он выполняется, но я подозреваю, что проблема заключается в том, когда вы добавляете свой начальный фрагмент.
Ты звонишь add
вместо replace
который просто добавит новый фрагмент поверх любых существующих. Идеально использовать замену, даже если контейнер еще ничего не содержит.
Фрагменты выживают в FragmentManager
и автоматически присоединяются к своему контейнеру, когда Activity
перезагружается. Правильная процедура заключается в проверке существующего Fragment
перед добавлением нового.
Добавить начальный фрагмент
Fragment f=getSupportFragmentManager().findFragmentById(R.id.frame);
if (f==null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.frame, RequestFragment.newInstance(), REQUEST_FRAGMENT_TAG).commit();
}
Кроме того, полезно использовать ведение журнала getSupportFragmentManager().getFragments().size();
пока вы отлаживаете. Он позволяет узнать, сколько фрагментов в настоящее время находится в FragmentManager, и может выделить потенциальные проблемы в вашем коде. Например, если ваш счет увеличивается каждый раз, когда вы поворачиваете устройство, вы добавляете фрагменты, а не проверяете существующие.
Попробуйте использовать FragmentTransaction.commitAllowingStateLoss() вместо использования commit()
Иногда это происходит из-за фона фрагмента. Попробуйте установить сплошной фон для всех фрагментов в стеке, чтобы он не был пустым или не установлен на @null.