Search code examples
androidandroid-fragmentsnavigation-drawerandroid-architecture-navigationandroid-navigationview

Android: Navigation Component not working with both: <navigation> and NavigationItemSelectedListener


What I have done:

I have created Navigation Drawer Activity, As updated new format of Navigation Drawer Activity, As per new Android architecture I got it with Navigation Component structure.

The NavigationView code with NavController and NavigationUI as below which is opening fragment when I click on any navigation item.

    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    NavigationView navigationView = findViewById(R.id.nav_view);
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    mAppBarConfiguration = new AppBarConfiguration.Builder(
            R.id.nav_home, R.id.nav_profile, R.id.nav_privacy_policy,
            R.id.nav_terms, R.id.nav_contact_us, R.id.nav_share, R.id.nav_send)
            .setDrawerLayout(drawer)
            .build();
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(navigationView, navController);

This is for nav_host_fragment:

<fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/mobile_navigation" />

The navigation is happening using this navigation/mobile_navigation.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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mobile_navigation"
    app:startDestination="@+id/nav_home">

    <fragment
        android:id="@+id/nav_home"
        android:name="com.sohamerp.marsremedies.fragment.HomeFragment"
        android:label="@string/menu_home"
        tools:layout="@layout/fragment_home" />

    <fragment
        android:id="@+id/nav_profile"
        android:name="com.sohamerp.marsremedies.fragment.ProfileFragment"
        android:label="@string/menu_my_profile"
        tools:layout="@layout/fragment_profile" />

    <fragment
        android:id="@+id/nav_privacy_policy"
        android:name="com.sohamerp.marsremedies.fragment.PrivacyPolicyFragment"
        android:label="@string/menu_privacy_policy"
        tools:layout="@layout/fragment_privacy_policy" />

    <fragment
        android:id="@+id/nav_terms"
        android:name="com.sohamerp.marsremedies.fragment.TermsConditionFragment"
        android:label="@string/menu_terms"
        tools:layout="@layout/fragment_terms_condition" />

    <fragment
        android:id="@+id/nav_contact_us"
        android:name="com.sohamerp.marsremedies.fragment.ContactUsFragment"
        android:label="@string/menu_contact_us"
        tools:layout="@layout/fragment_terms_condition" />

</navigation>

Where I am getting problem:

The Android Studio has create fragments for all the 6 menus but I dont want to open fragment on click of last two items. So for that I removed last two <fragment> tags from mobile_navigation.xml

enter image description here

I have tried to add setNavigationItemSelectedListener of below.

    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
            if (menuItem.getItemId() == R.id.nav_share)
                Toast.makeText(NavigationMenuActivity.this, "Sharing...", Toast.LENGTH_SHORT).show();
            else if (menuItem.getItemId() == R.id.nav_send)
                Toast.makeText(NavigationMenuActivity.this, "Rating...", Toast.LENGTH_SHORT).show();
            return false;
        }
    });

The Toast is displaying when I click on last two menu but the first 4 menu are not working.

What can I do to make it working?

build.gradle dependency:

implementation 'androidx.navigation:navigation-fragment:2.1.0'
implementation 'androidx.navigation:navigation-ui:2.1.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'

Solution

  • I got the solution as below:

        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top-level destinations.
        mAppBarConfigurationLeft = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_outstanding, R.id.nav_profile, R.id.nav_privacy_policy,
                R.id.nav_terms, R.id.nav_contact_us, R.id.nav_share, R.id.nav_send)
                .setOpenableLayout(binding.drawerLayout)
                .build();
        navControllerLeft = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navControllerLeft, mAppBarConfigurationLeft);
        NavigationUI.setupWithNavController(binding.navView, navControllerLeft);
    
        setUpHeaderView();
    
        /**
         * Clear Mapping code if Salesman or Admin has logged in
         */
        binding.navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    case R.id.nav_home:
                        navControllerLeft.navigate(R.id.nav_home);
                        break;
                    case R.id.nav_outstanding:
                        navControllerLeft.navigate(R.id.nav_outstanding);
                        break;
                    case R.id.nav_profile:
                        navControllerLeft.navigate(R.id.nav_profile);
                        break;
                    case R.id.nav_privacy_policy:
                        navControllerLeft.navigate(R.id.nav_privacy_policy);
                        break;
                    case R.id.nav_terms:
                        navControllerLeft.navigate(R.id.nav_terms);
                        break;
                    case R.id.nav_contact_us:
                        navControllerLeft.navigate(R.id.nav_contact_us);
                        break;
                    case R.id.nav_share:
                        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
                        sharingIntent.setType("text/plain");
                        sharingIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.app_name));
                        sharingIntent.putExtra(Intent.EXTRA_TEXT, "Here I am sharing Skites App. Download here: https://play.google.com/store/apps/details?id=" + getPackageName());
                        sharingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(Intent.createChooser(sharingIntent, getString(R.string.app_name)));
                        break;
                    case R.id.nav_send:
                        try {
                            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + getPackageName())));
                        } catch (ActivityNotFoundException e) {
                            Toast.makeText(NavigationMenuActivity.this, "No Application Found to Rate", Toast.LENGTH_SHORT).show();
                        }
                        break;
                }
                binding.drawerLayout.closeDrawer(GravityCompat.START, true);
                return false;
            }
        });
    

    Hope it will helps, Thank you.