Нежелательная навигация при нажатии элемента OptionsMenu во фрагменте - PullRequest
1 голос
/ 03 апреля 2020

Мое приложение имеет одну активность и несколько фрагментов. Компонент навигации был использован для навигации, и это не очень сложно. Также 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);
}

И вот результат ... problem gif

Проблема, как вы можете видеть выше, когда я нажимаю кнопку «Отклонить все», приводит к переходу к исходному фрагменту. Но я не мог понять почему?

1 Ответ

0 голосов
/ 05 апреля 2020

После двух часов копания я обнаружил, что OnOptionsItemSelected MainActivity вызывает эту ситуацию. Потому что, как вы можете видеть, он обрабатывает все пункты меню и вызывает событие 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)
}
...