Как заменить фрагмент, используя NavController.navigate вместо добавления его сверху - PullRequest
0 голосов
/ 28 апреля 2019

Я использую «новую» навигацию Android Jetpack вместо того, чтобы полагаться на FragmentManager.У меня есть простая основная раскладка:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".activities.MainActivity">

    <FrameLayout
            android:id="@+id/root"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toTopOf="@id/bottomNav">

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

    </FrameLayout>
    <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottomNav"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:menu="@menu/bottom_menu"
            app:layout_constraintBottom_toBottomOf="@+id/root"/>



</android.support.constraint.ConstraintLayout>

и две дополнительные раскладки: «Splashscreen» с TextView, «Login» с кнопкой.Фрагмент заставки используется в качестве начальной точки, и слушатель определяется следующим образом:

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        textView.setOnClickListener{
            findNavController(nav_host_fragment).navigate(R.id.action_splashScreenFragment_to_loginFragment)
        }
    }

снимок экрана

Вместо замены фрагмента TextView фрагментом Button, Buttonфрагмент сложен сверху.

Я встречал только обходные пути, такие как установка цвета фона и интерактивный параметр, который я считаю более хакерским, так как считаю, что поведение точно такое же, но фрагмент ниже простоскрытый.Как правильно переключать фрагменты с помощью NavController?

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Похоже, что проблема возникла из-за этих двух строк:

val host = NavHostFragment.create(R.navigation.navigation_register_login)
supportFragmentManager.beginTransaction().replace(R.id.nav_host_fragment,host).setPrimaryNavigationFragment(host).commit()

Я думаю, они не должны вызываться, и все основные требования удовлетворяются этой строкой в ​​макете:

android:name="androidx.navigation.fragment.NavHostFragment"
0 голосов
/ 28 апреля 2019

Вам необходимо использовать popUpTo и popUpToInclusive для очистки backstack. Проверьте Документы для разработчиков Android

...