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!
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.