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
How to Change the Edittext Text Without Triggering the Text Watcher
How to Draw an Arrowhead (In Android)
Nullpointerexception on Button.Findviewbyid()
Android Studio - Failed to Find Target Android-18
Android Call a Method from Another Class
What Is the Use of Memoryfile in Android
Simple Program to Call R from Java Using Eclipse and Rserve
Compare Protocol in Swift VS Interface in Java
Builder Pattern in Effective Java
Eclipse: Jvm Terminated. Exit Code=2
Multidex Noclassdeffound Error
Date Format Conversion Android
Java Object Analogue to R Data.Frame
How to Encode String (Use Encrypt Messagedigest in Java) to Base64 String in Swift