Search code examples
androidxmlkotlinnavigation-drawerandroid-toolbar

Navigation Drawer opening with clicking on toolbar search


I am working on an app that has a bottom navigation menu, a navigation drawer, and a search function in the toolbar. I have all but 1 thing working right now - The problem that I am experiencing is that when I click on the "search icon" in the toolbar, the drawer is also opening! I really don't understand why! I'm sure this is something simple that I just cannot see, but . . .

Anyway, can someone please help!

NavigationActivity.kt

class NavigationActivity  : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener{
    
    lateinit var drawerLayout: DrawerLayout
    private lateinit var appBarConfiguration: AppBarConfiguration
    lateinit var navController: NavController
    lateinit var navView: BottomNavigationView
    lateinit var myNavView: NavigationView
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_navigation)


        drawerLayout = findViewById(R.id.drawer_layout)
        navView = findViewById(R.id.nav_view)
        myNavView = findViewById(R.id.navigation_view) as NavigationView
        myNavView.setNavigationItemSelectedListener(this)

        navController = findNavController(R.id.nav_host_fragment)
        setupBottomNavigation()

        appBarConfiguration = AppBarConfiguration(setOf(
            R.id.navigation_map, R.id.navigation_list, R.id.navigation_workmates), drawerLayout)
        setupActionBarWithNavController(navController, appBarConfiguration)

    }
    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(navController,appBarConfiguration)

    }
    private fun setupBottomNavigation() {
        navView.setupWithNavController(navController)
    }


    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.search_menu, menu)


        val myActionMenuItem = menu!!.findItem(R.id.search)
        var searchView = myActionMenuItem.actionView as SearchView

        searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String): Boolean {
                
                toast(query)
                myActionMenuItem.collapseActionView()
                return false
            }

            override fun onQueryTextChange(s: String): Boolean {
                
                drawerLayout.closeDrawer(GravityCompat.START)
                return false
            }
        })
        return true
    }
    override fun onOptionsItemSelected(item: MenuItem?): Boolean {

            val check = drawerLayout.isDrawerOpen(GravityCompat.START)
            if (!check) {
                drawerLayout.openDrawer(GravityCompat.START)
            } else {
                drawerLayout.closeDrawer(GravityCompat.START)
            }
        return true
    }


    override fun onNavigationItemSelected(item: MenuItem): Boolean {
        var selectedOption = ""
        when (item?.itemId) {
            R.id.yourlunch -> selectedOption = "yourLunch"
            R.id.settings -> selectedOption = "settings"
            R.id.logout -> selectedOption = "logout"
        }
        when(selectedOption){
            "yourLunch" ->{
                toast("Your Lunch Selected")
            }
            "settings"->{
                toast("Settings Selected")
            }
            "logout" ->{
                toast("Logout Selected")
            }
        }
        return super.onOptionsItemSelected(item)
    }
}

navigation_drawer_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/yourlunch"
        android:title="@string/your_lunch"
        android:icon="@drawable/ic_baseline_fastfood_24" />
    <item
        android:id="@+id/settings"
        android:title="@string/settings"
        android:icon="@drawable/ic_baseline_settings_24"/>
    <item
        android:id="@+id/logout"
        android:title="@string/logout"
        android:icon="@drawable/ic_baseline_power_settings_new_24"/>
</menu>

search_memu.xml

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

    <item android:id="@+id/search"
        android:title="Search"
        android:icon="@drawable/ic_baseline_search_24"
        app:showAsAction="ifRoom|collapseActionView"
        app:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>

Thank you in advance for any help!


Solution

  • on onOptionsItemSelected method, you defined that when you click on options in the taskbar, it should open the drawer menu. try removing it. if you want to define which item to handle on the taskbar, user code below in onOptionsItemSelected:

    when(item.getId()){
    
        R.id.item1 -> ////
    
        R.id.item2 -> ////
    
    }
    

    use the id you gave to the menu items.