Search code examples
androidnavigationandroid-jetpack-navigation

Navigation Component with all fragments or some activities?


I'm making an app that at its core has a bottom navigation view. The concern arises when I need to navigate to a page that should not have nor show a bottom navigation view. If I use a fragment wouldn't the bottom navigation still show up since it's declared in the main activity's xml:

Main Activity XML

<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="?attr/actionBarSize">

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nav_view"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        android:background="?android:attr/windowBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/bottom_nav_menu" />

    <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:layout_constraintBottom_toTopOf="@id/nav_view"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/mobile_navigation" />
</androidx.constraintlayout.widget.ConstraintLayout>

My question is: Should I use a new activity with its own NavHostFragment and graph? Or maybe use nested navigation and keep using fragments? How would I hide the bottom navigation view if I do go with the latter?


Solution

  • As per the Listen for navigation events documentation:

    As an example, you might have common UI elements that you intend to show in some areas of your app while hiding them in others. Using your own OnDestinationChangedListener, you can selectively show or hide these UI elements based on the target destination

    So yes, you can selectively show or hide elements of your activity's UI, such as your BottomNavigationView when you move to certain destinations:

    navController.addOnDestinationChangedListener { _, destination, _ ->
        if(destination.id == R.id.full_screen_destination) {
            nav_view.visibility = View.GONE
        } else {
            nav_view.visibility = View.VISIBLE
        }
    }