Leandro Ocampo
Leandro Ocampo

Reputation: 2004

Navigation component with bottom navigation

I am working with navigation component and bottom navigation

val navController = indNavController(R.id.nav_host_fragment)
bottom_navigation.inflateMenu(R.menu.bottom_navigation_menu)
bottom_navigation.setupWithNavController(navController)

and I am facing the next issue:

When an item is selected in the bottom navigation, then a fragment is loaded. The problem comes when I press again the same item, then a new fragment will be loaded, which it does not make sense at all.

Example: 1- User selects menu item A, then FragmentA is loaded. 2- User selects again menu item A, then a new FragmentA will be loaded,

I was trying to use

bottom_navigation.setOnNavigationItemSelectedListener {  }

But then the bottom navigation will not work with the navController.

So the question is: there is a way to handle this situation in order to load again a new fragment when the user is in that screen already?

Upvotes: 3

Views: 3707

Answers (4)

Afanasyeu Alexei
Afanasyeu Alexei

Reputation: 147

when you use bottom_navigation.setOnNavigationItemSelectedListener { } before bottom_navigation.setupWithNavController(navController) the OnNavigationItemSelectedListener is overrided inside setupWithNavController function. So use

navController.addOnDestinationChangedListener { 
controller, destination, arguments -> 
    //destination.id for id fragment        
}

Upvotes: 0

reza herliansyah
reza herliansyah

Reputation: 11

I prefer to use the listener from navController:

navController.addOnDestinationChangedListener { 
    controller, destination, arguments -> 
        //destination.id for id fragment        
}

So the listener is triggered when the destination changes - not by clicking bottom_navigation.
Because setOnNavigationItemSelectedListener is already used when setupWithNavController is declared.

Upvotes: 1

Leandro Ocampo
Leandro Ocampo

Reputation: 2004

Finally, I was able to fix this issue.

As I said before, this code:

bottom_navigation.setupWithNavController(navController)

is using

bottom_navigation.setOnNavigationItemSelectedListener {  }

so every time I select / reselect an item, the navController will load a new fragment. I checked the javadoc for setOnNavigationItemSelectedListener() and it says:

Set a listener that will be notified when a bottom navigation item is selected. This listener * will also be notified when the currently selected item is reselected, unless an {@link * OnNavigationItemReselectedListener} has also been set.

So what I did is to add the next line to my code:

bottom_navigation.setOnNavigationItemReselectedListener { }

and that's all. The navController will load a fragment when an item is selected but not when an item is reselected in the bottom navigation.

Upvotes: 10

ExpensiveBelly
ExpensiveBelly

Reputation: 454

Try this to ignore the user's click on the same selected item:

bottom_navigation.apply {
        setOnNavigationItemSelectedListener {
            if (it.itemId == bottom_navigation.selectedItemId) {
                true
            } else when (it.itemId) { ... }

Upvotes: 0

Related Questions