Метод замены 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.

В конце я не вызывал метод фиксации.

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