问题
I am adding footer-view in navigation drawer using following code -
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
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/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.material.navigation.NavigationView
android:id="@+id/nv_top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|start">
<androidx.core.widget.NestedScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<include layout="@layout/nav_header_main"/>
<com.google.android.material.navigation.NavigationView
android:id="@+id/drawer_menu_body"
app:elevation="0dp"
android:layout_height="0dp"
android:layout_width="wrap_content"
android:layout_weight="1"
app:menu="@menu/activity_main_drawer">
</com.google.android.material.navigation.NavigationView>
<include layout="@layout/navigation_drawer_bottom_view"/>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</com.google.android.material.navigation.NavigationView>
</androidx.drawerlayout.widget.DrawerLayout>
But now onNavigationItemSelected() is not calling also navigation drawer keeps open until we slide it manually. I am using navigation-component and nav graph.
This is my activity code -
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val toolbar: Toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
val navController = findNavController(R.id.nav_host_fragment)
drawer_menu_body.setNavigationItemSelectedListener(this)
nv_top.setNavigationItemSelectedListener(this)
appBarConfiguration = AppBarConfiguration(
setOf(
R.id.nav_home,
R.id.nav_gallery,
R.id.nav_slideshow,
R.id.nav_tools,
R.id.nav_share,
R.id.nav_send
), drawer_layout)
setupActionBarWithNavController(navController, appBarConfiguration)
drawer_menu_body.setupWithNavController(navController)
nv_top.setupWithNavController(navController)
}
override fun onNavigationItemSelected(menu: MenuItem): Boolean {
Log.d("testing_navigation","testing_navigation")
drawer_layout.closeDrawer(GravityCompat.START)
return true
}
回答1:
You attach setNavigationItemSelectedListener
with NavigationView
which will override during default configuration of setupWithNavController
. So attach your listener after configuring default settings. Check below code.
nv_top.setupWithNavController(navController)
drawer_menu_body.setNavigationItemSelectedListener(this)
Update: To work with default navigation you have to handle like below:
override fun onNavigationItemSelected(menu: MenuItem): Boolean {
val handled = NavigationUI.onNavDestinationSelected(menu, navController)
if (!handled) {
// handle other navigation other than default
}
drawer_layout.closeDrawer(GravityCompat.START)
return handled
}
回答2:
Dear this worked for me the item R.id.nav_logout i needed finish activity and not instance a fragment:
private lateinit var appBarConfiguration: AppBarConfiguration
var drawerLayout: DrawerLayout? = null
var navView: NavigationView? = null
var navController: NavController? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_customer_main)
val toolbar: Toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
val fab: FloatingActionButton = findViewById(R.id.fab)
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
drawerLayout = findViewById(R.id.drawer_layout)
navView = findViewById(R.id.nav_view)
navController = findNavController(R.id.nav_host_fragment)
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
appBarConfiguration = AppBarConfiguration(setOf(
R.id.nav_home, R.id.nav_service_requests), drawerLayout)
setupActionBarWithNavController(navController!!, appBarConfiguration)
navView!!.setupWithNavController(navController!!)
navView!!.setNavigationItemSelectedListener(this)
}
override fun onSupportNavigateUp(): Boolean {
val navController = findNavController(R.id.nav_host_fragment)
return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
}
override fun onNavigationItemSelected(menuItem: MenuItem): Boolean {
menuItem.isChecked = true
drawerLayout!!.closeDrawers()
when (menuItem.itemId) {
R.id.nav_logout -> {
Prefs.putBoolean("flagLogin", false)
val intent = Intent(this@CustomerMainActivity, LoginActivity::class.java)
startActivity(intent)
finish()
return true
}
}
if( navController!!.currentDestination!!.id != menuItem.itemId)
navController!!.navigate(menuItem.itemId)
return true
}
来源:https://stackoverflow.com/questions/60072986/onnavigationitemselected-not-calling-when-item-is-selected