android - 在 fragment 中点击OptionsMenu项时不需要的导航

标签 android android-fragments kotlin android-architecture-navigation optionmenu

我的应用程序有一个 Activity 和几个片段。导航组件用于导航,并不是很复杂。 BottomNavigationComponent也用于底部导航。
可以通过底部导航访问三个顶层片段,其中一个顶层片段中有一个选项菜单。同样,这也不是一个复杂的菜单。只有一件。

因此,这没什么大不了的,创建菜单如下。

通知_菜单

<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);
}

结果是...
problem gif

如上所示,问题是,当我点击全部关闭按钮时,它导航到初始片段。但是我不明白为什么?

最佳答案

挖了两个小时后,我发现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)
}

关于android - 在 fragment 中点击OptionsMenu项时不需要的导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61008359/

相关文章:

安卓蓝牙获取连接设备

java - 避免代码重复 Android 类

android - 如何通过VNC使用安卓模拟器

php - 在 Android 上显示远程图像

android - 在android中以编程方式设置 fragment 参数

java - JodaTime:如何从 LocalTime 获取格式为 "HH:mm Z"的字符串表示形式

java - 什么情况下toSet会抛出java.lang.IllegalArgumentException?

Android:Fragment与直接在其之上的另一个Fragment之间的通信

android - FloatingActionButton 子菜单

kotlin - "Pattern match"不适用于 Int 子句(分支)