Search code examples
androidkotlinandroid-actionbarandroid-toolbarandroid-navigation

How to Completely Hide the Back Button (Up Button) in a Toolbar in Android?


I'm working on an Android app with one MainActivity and three fragments. I've successfully disabled the back button (Up button) in the toolbar, but it still gets rendered in the toolbar. I want to ensure that the back button does not appear at all.

Even though I've disabled the back button using supportActionBar?.setDisplayHomeAsUpEnabled(false) and supportActionBar?.setDisplayShowHomeEnabled(false), it still gets rendered in the toolbar.

Here's the relevant code from my MainActivity:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)

    val toolbar = binding.toolbar
    setSupportActionBar(toolbar)
    toolbar.navigationIcon = null
    toolbar.title = "New Fragment Name"

    // Hide the back button (Up button) if it's present
    supportActionBar?.setDisplayHomeAsUpEnabled(false)
    supportActionBar?.setDisplayShowHomeEnabled(false)

    val navController = findNavController(R.id.nav_host_fragment_content_main)
    appBarConfiguration = AppBarConfiguration(navController.graph)
    setupActionBarWithNavController(navController, appBarConfiguration)

}

override fun onSupportNavigateUp(): Boolean {
    /*val navController = findNavController(R.id.nav_host_fragment_content_main)
    return navController.navigateUp(appBarConfiguration)
            || super.onSupportNavigateUp()*/
    Toast.makeText(this, "Back button disabled", Toast.LENGTH_SHORT).show()
    return false
}

What I've Tried: Set toolbar.navigationIcon = null to remove the back button icon. Set supportActionBar?.setDisplayHomeAsUpEnabled(false) to disable the back button functionality. Set supportActionBar?.setDisplayShowHomeEnabled(false) to hide the home button. What I Need: I need to ensure that the back button does not appear in the toolbar at all, regardless of any actions or configurations.

This is my app/src/main/res/layout/activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".ui.mainActivity.MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true">

        <com.google.android.material.appbar.MaterialToolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize" />

    </com.google.android.material.appbar.AppBarLayout>

    <include layout="@layout/content_main" />


</androidx.coordinatorlayout.widget.CoordinatorLayout>

And a screenshot that shows that the back button in the toolbar is still getting rendered
enter image description herea screenshot that shows that the back button in the toolbar is still getting rendered

Any help on how to completely remove the back button from the toolbar would be greatly appreciated!


Solution

  • If you use navController.graph for AppBarConfiguration, it will render back button if the fragment is not startDestination declared in navigation/your_navigation.xml (e.g. app:startDestination="@+id/home").

    To solve this problem, you can use topLevelDestinationIds in AppBarConfiguration.

    val appBarConfiguration = AppBarConfiguration(
       topLevelDestinationIds = setOf(R.id.home, R.id.dashboard, R.id.notifications)
    )
    

    topLevelDestinationIds are fragment ids.