1

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()
    }
}
Zain
  • 13,030
  • 5
  • 26
  • 49
MVP
  • 49
  • 7

2 Answers2

2

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.

Sergiob
  • 534
  • 6
  • 15
1

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)
Zain
  • 13,030
  • 5
  • 26
  • 49