При замене фрагмента новый фрагмент не перекрывает старый

Всем привет. Столкнулся вот с такой проблемой при замене фрагмента,старый фрагмент остается виден под новым фрагментом введите сюда описание изображения

Изначально при запуске приложения появляется фрагмент приветствия с картинкой, затем фрагменты меняются но экран приветствия остается. Вот мой код

(activity as AppCompatActivity).supportFragmentManager
        .beginTransaction()
        .setCustomAnimations(
            R.anim.enter_from_right,
            R.anim.exit_to_right
        )
        .replace(R.id.nav_host_fragment, FoodAnalysisFragment())
        .commit()

<fragment
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:navGraph = "@navigation/mobile_navigation"
    app:defaultNavHost="true"
    />

Так же есть еще вторая проблема. Я скрыл toolbar в стартовом фрагменте с приветствием и при вызове следующего фрагмента я обратно показываю toolbar, но toolbar отображается с предыдущего фрагмента

так я прячу toolbar в стартовом фрагменте

(activity as AppCompatActivity).supportActionBar?.hide()

и аналогичным способом отображаю toolbar в новом фрагменте но в место hide() вызываю show(). Как сделать так чтоб после показа экрана с приветствием я больше не мог обращаться к нему? Заранее спасибо за помощь


Ответы (3 шт):

Автор решения: Sergei Buvaka

Вы можете второму фрагменту сделать непрозрачный фон (т.е. явно указать белый цвет фона к примеру), и тогда вы не будете видеть нижний фрагмент.

→ Ссылка
Автор решения: Style-7

Попробуйте в разметке поместит контейнер

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/container"/>

а уже в нем делать replace, иначе у вас как я понял fragment сам становится контейнером, что приводит к этому эффекту. Первый фрагмент также должен быть помещен в этот контейнер.

→ Ссылка
Автор решения: Mardanov Asif

Почему бы Вам сначала не удалить первый фрагмент, а потом просто добавить второй?

Что-то типа:

(activity as AppCompatActivity).supportFragmentManager
        .beginTransaction()
        .remove(первый фрагмент)
        .add(R.id.nav_host_fragment, FoodAnalysisFragment(), "food_analysis_tag");
        .commit();

Вы использовали статический вариант добавления фрагментов, где особо и не предполагается, что фрагменты будут удалять и добавлять.

Другое дело, использовать динамический вариант добавления фрагментов. В этом случае Вы просто создаете пустой контейнер, куда можете добавлять сколь угодно фрагментов [предварительно опустошая контейнер].

→ Ссылка