#android #android-toolbar #android-architecture-navigation #android-navigation
Вопрос:
Я использую навигационный компонент, который автоматически обрабатывает, должно ли приложение отображать кнопку меню для отображения, чтобы открыть навигационный ящик, или кнопку Назад, чтобы вернуться домой (например, панель мониторинга).:
setupActionBarWithNavController(navController, appBarConfiguration) binding.navigationDrawer.setupWithNavController(navController) binding.bottomNavigationView.setupWithNavController(navController)
и navController.addOnDestinationChangedListener { _, destination, bundle -gt; ... }
Так что это может быть
или
Компонент навигации автоматически устанавливает эти значки.
Как я могу переопределить каждый значок? Мне нужно переопределить значок меню и кнопки «Назад».
Пожалуйста, не упоминайте методы, которые устанавливают только один значок…
Комментарии:
1. Вы хотите изменить тип значка, т. е. стрелку «Бургер» / «назад»?
2. @Zain да, но не в
addOnDestinationChangedListener
Ответ №1:
Компонент навигации автоматически устанавливает эти значки.
Как я могу переопределить каждый значок? Мне нужно переопределить значок меню и кнопки «Назад».
Итак, теперь вы можете перемещаться между фрагментами, после чего вы удалили фрагмент, который хотите отобразить кнопкой «Назад/вверх», из верхней иерархии AppBarConfiguration
.
Предположим, у вас есть 3 фрагмента: главная страница, галерея и слайд-шоу; и вы хотите показать кнопку «Назад» на фрагменте галереи и кнопку «обычное меню» в других.
Итак, у вас будет что-то вроде:
val appBarConfiguration = AppBarConfiguration( setOf( R.id.nav_home, R.id.nav_slideshow ), drawerLayout ) setupActionBarWithNavController(navController, appBarConfiguration)
Теперь нам нужно изменить значки без использования addOnDestinationChangedListener
.
Значок можно изменить с помощью supportActionBar.setHomeAsUpIndicator(drawableRes)
Но на самом деле значки нужно менять вручную, так как это не поведение по умолчанию для макета ящика, и компоненты навигации об этом понятия не имеют; поэтому вы можете сделать это с помощью API макета ящика.
Итак, сначала зарегистрируйте слушателя на этот значок , binding.drawerLayout.addDrawerListener(toggle)
и для этого необходимо создать ActionBarDrawerToggle
, поэтому сохраните его локально в действии, а остальное-в комментариях к коду:
class MainActivity : AppCompatActivity() { private var toggle: ActionBarDrawerToggle? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Intialization code is omitted.... toggle = getActionBarDrawerToggle(binding.drawerLayout, binding.appBarMain.toolbar).apply { setToolbarNavigationClickListener { // Back to home fragment for any hit to the back button navController.navigate(R.id.nav_home) } // Intialize the icon at the app start enableHomeBackIcon(false) } } fun enableHomeBackIcon(enabled: Boolean) { // Enable/Disable opening the drawer from the start side toggle?.isDrawerIndicatorEnabled = !enabled // Change the default burger icon supportActionBar?.setHomeAsUpIndicator( if (enabled) R.drawable.back_arrow else R.drawable.burger ) } private fun getActionBarDrawerToggle( drawerLayout: DrawerLayout, toolbar: Toolbar ): ActionBarDrawerToggle { toggle = ActionBarDrawerToggle( this, drawerLayout, toolbar, R.string.open, R.string.close ) drawerLayout.addDrawerListener(toggle!!) toggle?.syncState() return toggle as ActionBarDrawerToggle } }
И в соответствии с вашими требованиями, вместо использования addOnDestinationChangedListener
вы можете использовать метод жизненного цикла фрагментов ящика; Я буду использовать onViewCreated()
:
Фрагмент «Главная страница» и слайд-шоу: Отключите кнопку «Назад» с помощью действия:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) (requireActivity() as MainActivity).enableHomeBackIcon(false) }
Фрагмент галереи: Включите кнопку «Назад» с помощью действия:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) (requireActivity() as MainActivity).enableHomeBackIcon(true) }