Search code examples
androidlistenerandroid-architecture-navigationnavigationviewandroid-navigationview

overriding onNavigationItemSelected stops navigation to fragments on item click in drawerLayout


overriding onNavigationItemSelected stops navigation component functionality of opening fragments on item click, instead it calls onNavigationItemSelected and nothing else happens.

navigation view setup called in on create

    private fun setupNavigationDrawer(){

        NavigationUI.setupWithNavController(binding.navigationView,navHostFragment.findNavController())
        binding.navigationView.setNavigationItemSelectedListener(this)


    }

activity

class MainActivity : AppCompatActivity(),NavigationView.OnNavigationItemSelectedListener

onNavigationItemSelected

    override fun onNavigationItemSelected(item: MenuItem): Boolean {
        if(binding.mainActivityRootView.isDrawerOpen(GravityCompat.END)){
            binding.mainActivityRootView.closeDrawer(GravityCompat.END)
        }
        else if(binding.mainActivityRootView.isDrawerOpen(GravityCompat.START)){
            binding.mainActivityRootView.closeDrawer(GravityCompat.START)
        }
        return true

    }

Navigation view xml

<com.google.android.material.navigation.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        app:menu="@menu/menu_home_navigation_drawer"
        android:paddingStart="15dp"
        android:paddingEnd="15dp"

        app:headerLayout="@layout/layout_navigation_drawer_header"
        app:itemIconTint="@color/lipstick"
        android:layout_gravity="end"
        app:drawerLayoutCornerSize="10dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" >

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_gravity="bottom"
            android:layout_marginBottom="40dp"
            >

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/ic_main_blue"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:tint="@color/lipstick" />

            <TextView
                android:id="@+id/textView41"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:fontFamily="@font/montserratmedium"
                android:text="Version IMPLEMENT"
                android:textColor="@color/pinkish_grey"
                android:textSize="10sp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent" />


        </androidx.constraintlayout.widget.ConstraintLayout>

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

i have set menu item id as navigation fragment id and it works without the onNavigationItemSelected being set i also have navigation view below fragment container in xml

i tried to

-change return value onNavigationItemSelected -setting up onNavigationItemSelected listener before setupWithNavController which results in the listener not getting called at all


Solution

  • In the end i solved it by manually opening fragments

    from

        override fun onNavigationItemSelected(item: MenuItem): Boolean {
        if(binding.mainActivityRootView.isDrawerOpen(GravityCompat.END)){
            binding.mainActivityRootView.closeDrawer(GravityCompat.END)
        }
        else if(binding.mainActivityRootView.isDrawerOpen(GravityCompat.START)){
            binding.mainActivityRootView.closeDrawer(GravityCompat.START)
        }
        return true
    
    }
    

    to

        override fun onNavigationItemSelected(item: MenuItem): Boolean {
        if(binding.mainActivityRootView.isDrawerOpen(GravityCompat.END)){
            binding.mainActivityRootView.closeDrawer(GravityCompat.END)
        }
        else if(binding.mainActivityRootView.isDrawerOpen(GravityCompat.START)){
            binding.mainActivityRootView.closeDrawer(GravityCompat.START)
        }
    
        when(item.itemId){
            else ->{
                NavigationUI.onNavDestinationSelected(item,navHostFragment.findNavController())
            }
        }
    
        return true
    }