Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Navigation - Removing Action Bar Back Button When Popping Back Stack

What I'm trying to do

I am using Android Navigation component to handle navigation in my app. In this example, I have two screens, screen A and screen B. I want the user to be able to click a button in screen A and be able to navigate to screen B; and then be prevented from going back to the previous screen (screen A).

The problem

When the user navigates to screen B from screen A, the back button on the action bar still allows the user to go back to the previous screen, however when clicking on the back button in the bottom bar it exits the app so this part works OK.

What do I need to do in order to remove the back button in the Action Bar?

enter image description here

What I've read so far

I have followed the guidance within these three articles but I think they might be ignoring the ActionBar's back button:

My Code

Navigation Graph - nav_graph.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"
    android:id="@+id/nav_graph"
    app:startDestination="@id/screen_a">
    <fragment
        android:id="@+id/screen_a"
        android:name="com.example.conditionalnavigation.AFragment"
        android:label="screen A">
        <action
            android:id="@+id/action_AFragment_to_BFragment"
            app:destination="@id/screen_b"
            app:launchSingleTop="true"
            app:popUpTo="@id/screen_a"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/screen_b"
        android:name="com.example.conditionalnavigation.BFragment"
        android:label="screen B" />
</navigation>

MainActivity - This acts as my Single Activity navhost.

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        val navController = this.findNavController(R.id.myNavHostFragment)

        NavigationUI.setupActionBarWithNavController(this, navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        val navController = this.findNavController(R.id.myNavHostFragment)
        return navController.navigateUp()
    }
}
like image 367
MVP Avatar asked Sep 05 '25 07:09

MVP


2 Answers

In your activity class add the following member (in Kotlin):

private lateinit var appBarConfiguration: AppBarConfiguration

Inside the onCreate method add the following lines:

....
val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
...
...
appBarConfiguration = AppBarConfiguration(
            setOf([**ID of the fragment layout you want without back button**],                
            ), drawerLayout
        )

setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)

    ....

In this way your fragment will be a root fragment and the back button is removed. Hope it helps.

like image 147
Sergiob Avatar answered Sep 07 '25 20:09

Sergiob


Try to disable home button at the creation of screen b fragment:

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    var rootView = inflater?.inflate(R.layout.fragment_screen_b, container, false)
     (activity as AppCompatActivity).supportActionBar!!.setDisplayHomeAsUpEnabled(false)

    return rootView
}

If it didn't work, then try it in onViewCreated() method.

If not worked, try to add below as well:

setHasOptionsMenu(false)
like image 25
Zain Avatar answered Sep 07 '25 20:09

Zain