在 Fragment 中点击 OptionsMenu 项时不需要的导航
Unwanted navigation when tapping OptionsMenu Item in Fragment
我的应用程序有一个 Activity 和几个片段。 Navigation Component是用来导航的,不是很复杂。 BottomNavigationComponent 也用于底部导航。
可以通过底部导航访问三个顶级片段,其中一个顶级片段有一个选项菜单。这也不是一个复杂的菜单;只有一项。
所以,这没什么大不了的,创建的菜单如下所示。
notifications_menu
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/dismiss_all"
android:title="@string/dismiss_all"
android:orderInCategory="10"
app:showAsAction="ifRoom" />
</menu>
NotificationsFragment.kt
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
viewModel =
ViewModelProvider.NewInstanceFactory().create(NotificationsViewModel::class.java)
setHasOptionsMenu(true)
(activity as MainActivity).supportActionBar?.setDisplayHomeAsUpEnabled(false)
(activity as MainActivity).supportActionBar?.setDisplayShowHomeEnabled(false)
//other stuff
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.notifications_menu, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val id = item.itemId
if (id == R.id.dismiss_all) {
// there is no code here yet
return true
}
return super.onOptionsItemSelected(item);
}
这是结果……
问题是,正如您在上面看到的,当我点击“全部关闭”按钮时,它会导航到初始片段。但我不明白为什么?
挖了两个小时,发现是MainActivity的onOptionsItemSelected导致了这种情况。因为如您所见,它正在处理所有菜单项并调用 onBackPressed 事件。
override fun onOptionsItemSelected(menuItem: MenuItem?): Boolean {
if (menuItem != null) {
onBackPressedDispatcher.onBackPressed()
}
return super.onOptionsItemSelected(menuItem)
}
正确处理此方法解决了我的问题。
这是上面代码的正确版本。
override fun onOptionsItemSelected(menuItem: MenuItem?): Boolean {
val id = menuItem?.itemId
if (id == android.R.id.home) {
onBackPressedDispatcher.onBackPressed()
return true
}
return super.onOptionsItemSelected(menuItem)
}
我的应用程序有一个 Activity 和几个片段。 Navigation Component是用来导航的,不是很复杂。 BottomNavigationComponent 也用于底部导航。 可以通过底部导航访问三个顶级片段,其中一个顶级片段有一个选项菜单。这也不是一个复杂的菜单;只有一项。
所以,这没什么大不了的,创建的菜单如下所示。
notifications_menu
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/dismiss_all"
android:title="@string/dismiss_all"
android:orderInCategory="10"
app:showAsAction="ifRoom" />
</menu>
NotificationsFragment.kt
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
viewModel =
ViewModelProvider.NewInstanceFactory().create(NotificationsViewModel::class.java)
setHasOptionsMenu(true)
(activity as MainActivity).supportActionBar?.setDisplayHomeAsUpEnabled(false)
(activity as MainActivity).supportActionBar?.setDisplayShowHomeEnabled(false)
//other stuff
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.notifications_menu, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val id = item.itemId
if (id == R.id.dismiss_all) {
// there is no code here yet
return true
}
return super.onOptionsItemSelected(item);
}
这是结果……
问题是,正如您在上面看到的,当我点击“全部关闭”按钮时,它会导航到初始片段。但我不明白为什么?
挖了两个小时,发现是MainActivity的onOptionsItemSelected导致了这种情况。因为如您所见,它正在处理所有菜单项并调用 onBackPressed 事件。
override fun onOptionsItemSelected(menuItem: MenuItem?): Boolean {
if (menuItem != null) {
onBackPressedDispatcher.onBackPressed()
}
return super.onOptionsItemSelected(menuItem)
}
正确处理此方法解决了我的问题。 这是上面代码的正确版本。
override fun onOptionsItemSelected(menuItem: MenuItem?): Boolean {
val id = menuItem?.itemId
if (id == android.R.id.home) {
onBackPressedDispatcher.onBackPressed()
return true
}
return super.onOptionsItemSelected(menuItem)
}