Setnavigationitemselectedlistener Not Working

setNavigationItemSelectedListener Not Working

I had the same problem, and I discovered that Android is VERY particular about the layout XML. I had my NavigationView as the first child of the DrawerLayout, but it has to be the last child for some stupid reason. So your layout must have the elements in this order:

<DrawerLayout>
<FrameLayout/>
<NavigationView/>
</DrawerLayout>

NOT in this order:

<DrawerLayout>
<NavigationView/>
<FrameLayout/>
</DrawerLayout>

Navigation Drawer: setNavigationItemSelectedListener is not working.

In order to use this setNavigationItemSelectedListener you should have menu as give below in res->menu folder

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_payment"
android:checked="false"
android:icon="@drawable/ic_action_payment"
android:title="@string/menu_payment" />

<item
android:id="@+id/menu_history"
android:checked="false"
android:icon="@drawable/ic_action_history"
android:title="@string/menu_history" />
</menu>

onNavigationItemSelected not working in NavigationView

Have a look at your MainActivity.java.

You have implemented the callbacks for NavigationView.OnNavigationItemSelectedListener in MainActivity as below,

@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
// blah blah
}

Also check the setupDrawerContent method.

private void setupDrawerContent(NavigationView navigationView) {
navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
menuItem.setChecked(true);
drawerLayout.closeDrawers();
return true;
}
});
}

In this method you are creating a local OnNavigationItemSelectedListener.

So you are not using the OnNavigationItemSelectedListener that you have overridden in MainActivity.

The solution is to use this as argument for setNavigationItemSelectedListener. By doing this all your clicks will go the onNavigationItemSelected of MainActivity rather than going to the local onNavigationItemSelected.

private void setupDrawerContent(NavigationView navigationView) {
navigationView.setNavigationItemSelectedListener(this);
}

Also move the code in the local onNavigationItemSelected to the onNavigationItemSelected of MainActivity.

So your onNavigationItemSelected will be something like this,

@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
// Handle navigation view item clicks here.
int id = menuItem.getItemId();
menuItem.setChecked(true);
drawerLayout.closeDrawers();

if (id == R.id.nav_home) {
// Handle the home action
Toast.makeText(this, "Home", Toast.LENGTH_SHORT).show();
} else if (id == R.id.nav_the_wetlands) {
Toast.makeText(this, "The Wetlands", Toast.LENGTH_SHORT).show();
TheWetlandsFragment theWetlandsFragment = new TheWetlandsFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.relativelayout_for_fragment, theWetlandsFragment, theWetlandsFragment.getTag()).commit();
} else if (id == R.id.nav_the_mistbelt_forests) {
Toast.makeText(this, "The Mistbelt Forests", Toast.LENGTH_SHORT).show();
}

DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}

Also change your activity_main_drawer_view.xml as follows to solve the multiple selection issue you have in the Navigation Drawer,

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

<group android:checkableBehavior="single">
<item
android:id="@+id/nav_home"
android:icon="@drawable/ic_dashboard"
android:title="Home" />
</group>

<item android:title="Information">
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_the_wetlands"
android:icon="@drawable/ic_event"
android:title="The Wetlands" />
<item
android:id="@+id/nav_the_mistbelt_forests"
android:icon="@drawable/ic_event"
android:title="The Mistbelt Forests" />
<item
android:id="@+id/nav_the_grasslands"
android:icon="@drawable/ic_event"
android:title="The Grasslands" />
</group>
</item>

<item android:title="Quick Go To">
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_accommodation"
android:icon="@drawable/ic_event"
android:title="Accommodation" />
<item
android:id="@+id/nav_cuisine"
android:icon="@drawable/ic_forum"
android:title="Cuisine" />
<item
android:id="@+id/nav_leisure_activites"
android:icon="@drawable/ic_forum"
android:title="Leisure & Activites" />
<item
android:id="@+id/nav_agri_tourism"
android:icon="@drawable/ic_forum"
android:title="Agri-tourism" />
<item
android:id="@+id/nav_education"
android:icon="@drawable/ic_forum"
android:title="Education" />
<item
android:id="@+id/nav_arts_crafts_decor"
android:icon="@drawable/ic_forum"
android:title="Arts, Crafts & DeCor" />
<item
android:id="@+id/nav_selective_shopping"
android:icon="@drawable/ic_forum"
android:title="Selective Shopping" />
<item
android:id="@+id/nav_for_children"
android:icon="@drawable/ic_forum"
android:title="For Children" />
</group>
</item>

<item android:title="Midlands Animals">
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_midlands_birding_checklist"
android:icon="@drawable/ic_dashboard"
android:title="Midlands Birding Checklist" />
<item
android:id="@+id/nav_midlands_mammals_checklist"
android:icon="@drawable/ic_dashboard"
android:title="Midlands Mammals Checklist" />
</group>
</item>

</menu>

Good luck.

NavigationView OnNavigationItemSelectedListener not being called

When you make XML layout, you should write down NavigationView after BaseLayout (FrameLayout, LinearLayout, etc..)

<DrawerLayout>
<FrameLayout />
<NavigationView />
</DrawerLayout>

NavigationView onNavigationItemSelected not working

You can't use NavigationUI.setupWithNavController() and setNavigationItemSelectedListener() together.

onNavigationItemSelected will work if you remove this line from your code:

    NavigationUI.setupWithNavController(navigationView, navController);

but then you have to handle fragment transactions manually.

onNavigationItemSelected not functioning?

It was right in front of my eyes the whole time, these two don't function well together:

        navigationView.setupWithNavController(navController)
navigationView.setNavigationItemSelectedListener(this)

I removed the first line and kept the second, now all transactions of fragments are happening and the onNavigationItemSelected is working flawlessly.

onNavigationItemSelected not work on DrawerLayout

The error is in your layout.

You can check the doc of the DrawerLayout:

To use a DrawerLayout, position your primary content view as the first child with width and height of match_parent and no <layout_gravity>

Change your layout:

 <androidx.drawerlayout.widget.DrawerLayout
.....
tools:openDrawer="start">

<!-- NavigationView -->
<com.google.android.material.navigation.NavigationView
../>

<!-- main content view -->
<LinearLayout...>

</LinearLayout>

</androidx.drawerlayout.widget.DrawerLayout>

To:

 <androidx.drawerlayout.widget.DrawerLayout
.....
tools:openDrawer="start">

<!-- main content view -->
<LinearLayout...>

</LinearLayout>

<!-- NavigationView -->
<com.google.android.material.navigation.NavigationView
../>

</androidx.drawerlayout.widget.DrawerLayout>


Related Topics



Leave a reply



Submit