Search code examples
androidandroid-studioandroid-fragmentsnavigation-drawer

How to remove navigation drawer?


I want to remove the navigation drawer from my fragment_login and fragment_create_account fragments. I removed the bottom navigation and toolbar from these fragments using addOnDestinationChangedListener with the following code for toolbar:

navController.addOnDestinationChangedListener { _, destination, _ ->
            when(destination.id) {
                R.id.loginFragment, R.id.createAccountFragment ->
                    toolbar.visibility = View.GONE
                else -> toolbar.visibility = View.VISIBLE
            }
        }

Similarly, for bottom navigation:

navController.addOnDestinationChangedListener { _, destination, _ ->
            when(destination.id) {
                R.id.loginFragment, R.id.createAccountFragment ->
                    bottomNavigationView.visibility = View.GONE
                else -> bottomNavigationView.visibility = View.VISIBLE
            }
        }

I tried to do the same (same code as above for drawer layout) with navigation drawer but it didn't worked and turned the whole application blank. Any help is appreciated.

MainActivity.KT

package com.example.integratedmodulateoroperationroom

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.fragment.findNavController
import androidx.navigation.ui.*
import com.google.android.material.bottomnavigation.BottomNavigationView
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    private lateinit var navController: NavController
    private lateinit var appBarConfiguration: AppBarConfiguration
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navHostFragment =
            supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
        navController = navHostFragment.findNavController()

        appBarConfiguration = AppBarConfiguration(
            setOf(R.id.homeFragment, R.id.loginFragment),
            drawer_layout
        )

        setSupportActionBar(toolbar)
        setupActionBarWithNavController(navController, appBarConfiguration)

        navController.addOnDestinationChangedListener { _, destination, _ ->
            when(destination.id) {
                R.id.loginFragment, R.id.createAccountFragment ->
                    toolbar.visibility = View.GONE
                else -> toolbar.visibility = View.VISIBLE
            }
        }

        bottom_nav.setupWithNavController(navController)
        val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottom_nav)

        navController.addOnDestinationChangedListener { _, destination, _ ->
            when(destination.id) {
                R.id.loginFragment, R.id.createAccountFragment ->
                    bottomNavigationView.visibility = View.GONE
                else -> bottomNavigationView.visibility = View.VISIBLE
            }
        }

        nav_view.setupWithNavController(navController)
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.options_menu, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return item.onNavDestinationSelected(navController) || super.onOptionsItemSelected(item)
    }

    override fun onSupportNavigateUp(): Boolean {
        return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
    }
}

activitymain.XML:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/toolbar_backgroud"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toTopOf="@+id/bottom_nav"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar"
        app:navGraph="@navigation/nav_graph" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_nav"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:menu="@menu/bottom_nav_menu" />

    </androidx.constraintlayout.widget.ConstraintLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_gravity="start"
        app:menu="@menu/drawer_nav_menu"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        app:headerLayout="@layout/drawer_header"/>

</androidx.drawerlayout.widget.DrawerLayout>

nav_grah.XML

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/loginFragment">

    <fragment
        android:id="@+id/homeFragment"
        android:name="com.example.integratedmodulateoroperationroom.HomeFragment"
        android:label="Integrated Module OR (Operation Room)"
        tools:layout="@layout/fragment_home">
        <action
            android:id="@+id/action_homeFragment_to_otFragment"
            app:destination="@id/otFragment"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_left"
            app:popEnterAnim="@anim/slide_in_left"
            app:popExitAnim="@anim/slide_out_right" />
        <action
            android:id="@+id/action_homeFragment_to_surgicalFragment"
            app:destination="@id/surgicalFragment"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_left"
            app:popEnterAnim="@anim/slide_in_left"
            app:popExitAnim="@anim/slide_out_right" />
        <action
            android:id="@+id/action_homeFragment_to_laminarFragment"
            app:destination="@id/laminarFragment" />
    </fragment>
    <fragment
        android:id="@+id/otFragment"
        android:name="com.example.integratedmodulateoroperationroom.OtFragment"
        android:label="OT Lights"
        tools:layout="@layout/fragment_ot" />
    <fragment
        android:id="@+id/surgicalFragment"
        android:name="com.example.integratedmodulateoroperationroom.SurgicalFragment"
        android:label="Surgical Lights"
        tools:layout="@layout/fragment_surgical" />
    <fragment
        android:id="@+id/settingsFragment"
        android:name="com.example.integratedmodulateoroperationroom.SettingsFragment"
        android:label="Settings"
        tools:layout="@layout/fragment_settings" />
    <fragment
        android:id="@+id/laminarFragment"
        android:name="com.example.integratedmodulateoroperationroom.LaminarFragment"
        android:label="Laminar Airflow"
        tools:layout="@layout/fragment_laminar" />
    <fragment
        android:id="@+id/loginFragment"
        android:name="com.example.integratedmodulateoroperationroom.LoginFragment"
        android:label="Login"
        tools:layout="@layout/fragment_login" >
        <action
            android:id="@+id/action_loginFragment_to_homeFragment"
            app:destination="@id/homeFragment"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_left"
            app:popEnterAnim="@anim/slide_in_left"
            app:popExitAnim="@anim/slide_out_right"
            app:popUpTo="@id/homeFragment"
            app:popUpToInclusive="true" />
        <action
            android:id="@+id/action_loginFragment_to_createAccountFragment"
            app:destination="@id/createAccountFragment" />
    </fragment>
    <fragment
        android:id="@+id/aboutFragment"
        android:name="com.example.integratedmodulateoroperationroom.AboutFragment"
        android:label="About"
        tools:layout="@layout/fragment_about" />
    <fragment
        android:id="@+id/createAccountFragment"
        android:name="com.example.integratedmodulateoroperationroom.CreateAccountFragment"
        android:label="CreateAccountFragment"
        tools:layout="@layout/fragment_create_account">
        <action
            android:id="@+id/action_createAccountFragment_to_loginFragment"
            app:destination="@id/loginFragment"
            app:popUpTo="@id/loginFragment"
            app:popUpToInclusive="true" />
    </fragment>
</navigation>

Solution

  • What I did not knew was that I had to lock the navigation drawer. So, by using

    drawer_layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
    

    I successfully hid the navigation drawer. So, for making it appear in the rest of the fragments I used the code below:

    navController.addOnDestinationChangedListener { _, destination, _ ->
                when(destination.id) {
                    R.id.loginFragment, R.id.createAccountFragment ->
                        drawer_layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
                    else -> drawer_layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
                }
            }
        }