Как настроить собственное меню и значки назад для панели инструментов?

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