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>
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)
}
}
}