I am new to Android Studio and trying to create a Kotlin MVVM-based app. I want to implement a Navigation Drawer using a NavHostFragment within the app. I have defined the navigation layout containing all my different fragments to navigate. I would like to navigate to a fragment when an icon is clicked. This is the code that should allow this, but for some reason, the code doesn’t work.
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
tools:context=".CentralNavigationFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary" />
<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/central_app_navigation" />
</LinearLayout>
<com.google.android.material.navigation.NavigationView
android:id="@+id/navigation_drawer"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:menu="@menu/drawer_menu" />
</androidx.drawerlayout.widget.DrawerLayout>
@AndroidEntryPoint
class CentralNavigationFragment : Fragment(), NavigationView.OnNavigationItemSelectedListener {
val TAG: String = "CentralNavigationFragment"
lateinit var binding: FragmentCentralNavigationBinding
private lateinit var drawerToggle: ActionBarDrawerToggle
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val toolbar: androidx.appcompat.widget.Toolbar = binding.toolbar
val drawerLayout = binding.drawerLayout
val navigationView = binding.navigationDrawer
// Setup Toolbar
(requireActivity() as AppCompatActivity).setSupportActionBar(toolbar)
// Setup ActionBarDrawerToggle
drawerToggle = ActionBarDrawerToggle(
requireActivity(),
drawerLayout,
toolbar,
R.string.drawer_open,
R.string.drawer_close
)
drawerLayout.addDrawerListener(drawerToggle)
drawerToggle.syncState()
// Setup NavigationView
navigationView.setNavigationItemSelectedListener(this)
// Initialize NavController
val navController = findNavController()
// Set the default destination to HomeFragment
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentCentralNavigationBinding.inflate(inflater, container, false)
return binding.root
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
val navController = findNavController()
when (item.itemId) {
R.id.nav_home -> navController.navigate(R.id.home_navigation)
R.id.nav_first -> navController.navigate(R.id.executedSOFragment)
// R.id.logout -> navController.navigate(R.id.logOutFragment)
}
binding.drawerLayout.closeDrawer(GravityCompat.START)
return true
}
override fun onDestroyView() {
super.onDestroyView()
binding.drawerLayout.removeDrawerListener(drawerToggle)
}
I want to navigate to a fragment when an icon is clicked. in my navigation layout I have a nestedGraph ,I’ve tried to change the startDestination on icon clicked , but the app crashes at runtime, is there any way to implement this using Navhost