Add dependency:
dependencies {
...
implementation "com.google.android.material:material:$version_supportlib" // Add version number to build.gradle also
}
Make sure any Fragments you wish to navigate to have been added to the Navigation Design window.
Create a new menu (e.g. navdrawer_menu.xml) in the res/menu folder.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> // All of this can be done through the GUI also
<item
android:id="@+id/firstFragment"
android:icon="@drawable/first"
android:title="@string/first" />
<item
android:id="@+id/secondFragment"
android:icon="@drawable/second"
android:title="@string/second" />
</menu>
In your main Activity layout file:
<?xml version="1.0" encoding="utf-8"?><!--
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.drawerlayout.widget.DrawerLayout // Wrap the main ViewGroup in the DrawerLayout tag and give it an id
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<fragment
android:id="@+id/myNavHostFragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/navigation" />
</LinearLayout>
<com.google.android.material.navigation.NavigationView // Create the NavDrawer element and give it an id
android:id="@+id/navView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start" // Aligns it to the left of the screen for LtR languages
app:headerLayout="@layout/nav_header" // Point to a layout file to define a custom header for your menu
app:menu="@menu/navdrawer_menu" /> // Point it at the menu resource we just created
</androidx.drawerlayout.widget.DrawerLayout>
</layout>
And in the main Activity file:
import ...
class MainActivity : AppCompatActivity() {
lateinit var drawerLayout: DrawerLayout
lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@Suppress("UNUSED_VARIABLE")
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
navController = this.findNavController(R.id.myNavHostFragment)
drawerLayout = binding.drawerLayout // Get the DrawerLayout
NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout) // Add the DrawerLayout to the ActionBar
NavigationUI.setupWithNavController(binding.navView, navController) // Link the navigation view with the UI
}
override fun onSupportNavigateUp(): Boolean {
// return navController.navigateUp() // Get rid of this return statement
return NavigationUI.navigateUp(navController, drawerLayout) // Use this instead which includes the DrawerLayout
}
}
