androidandroid-fragmentsandroid-navigationview

onNavigationItemSelected not working in NavigationView


Please can someone help me with fragments from the navigation drawer, for some reason I can't get them to work and all the code looks right.

Here is the link to the source code.


Solution

  • 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 &amp; 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 &amp; 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.