Макет ящика с компонентом навигации - Слушатель только для одного элемента

У меня проблема с реализацией компонента "Макет ящика с навигацией".

Я создал макет выдвижного ящика, используя функцию включения навигационного ящика Android Studio.

На самом деле, все в порядке, если целью пунктов меню является изменение фрагментов или действий (например, программ, песен, настроек и т. Д. На скриншоте), определенных в XML навигации.

«Все

val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
    val navView: NavigationView = findViewById(R.id.nav_view)
    val 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_user_programs_list,
            R.id.nav_user_songs_list,
            R.id.nav_user_settings,
            R.id.nav_user_legal_notices,
            R.id.nav_games
        ), drawerLayout
    )
    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)

Однако я также хотел бы выполнить действие выхода из системы в пункте меню выхода без запуска другого фрагмента или действия:

«Диалоговое

У меня получилось вот так:

navView.setNavigationItemSelectedListener {
        if (it.itemId == R.id.nav_logout) {
            logoutUser()
        }
        true
    }

Но моя проблема: с этим методом все остальные элементы, которые раньше работали (изменение фрагмента), больше не работают, потому что он вызвал NavigationItemSelectedListener, который в этом случае ничего не делает.

Есть ли решение объединить оба метода? :

  • Изменение фрагмента с макетом ящика по умолчанию в студии Android
  • Использование NavigationItemSelectedListener только для выполнения действия только с одним элементом меню.

Надеюсь, это достаточно ясно. Не сомневайтесь, если вам нужна точность.

Большое тебе спасибо.


person Boysteuf    schedule 17.08.2020    source источник


Ответы (1)


Решение

Хорошо, я понял, вот что вам призывает фреймворк:

NavigationUI.onNavDestinationSelected(dest, navController)

Таким образом, вы можете сделать то же самое для всех остальных случаев:

        navView.setNavigationItemSelectedListener {dest ->
            when(dest.itemId) {
                R.id.logout -> logout()
                else -> NavigationUI.onNavDestinationSelected(dest, navController)
            }

            true
        }

Обновлять

Вышеупомянутое прекращает автоматическое закрытие ящика, так что ..

        navView.setNavigationItemSelectedListener {dest ->
            when(dest.itemId) {
                else -> {
                    NavigationUI.onNavDestinationSelected(dest, navController)
                    drawerLayout.closeDrawers()
                }
            }

            true
        }

person Martin Marconcini    schedule 17.08.2020