Работал ли с приложениями с tab bar

Ответ

Да, работал с приложениями с TabBar, используя как стандартные компоненты Android (TabLayout + ViewPager2), так и кастомные решения.

Пример с TabLayout и ViewPager2:

val viewPager = findViewById<ViewPager2>(R.id.viewPager)
val tabLayout = findViewById<TabLayout>(R.id.tabLayout)

viewPager.adapter = MyPagerAdapter(this)  
TabLayoutMediator(tabLayout, viewPager) { tab, position ->  
    tab.text = "Tab ${position + 1}"  
}.attach()

Нюансы:

  • Производительность: Для сложных фрагментов используем FragmentStateAdapter.
  • Кастомизация: Можно менять иконки, добавлять бейджи, анимации.
  • Jetpack Compose: В современных проектах использую TabRow + Pager из Accompanist.

Если нужно сложное поведение (например, скрытие/показ табов), делал кастомные решения на BottomNavigationView или ConstraintLayout.

Ответ 18+ 🔞

А, табы эти ваши! Да, работал, конечно, работал. И на стандартных штуках, и на кастомных, когда дизайнеры такие: «А давайте сделаем, чтобы таб не просто переключался, а ещё выезжал из-под экрана и пел гимн!». Ёперный театр, одним словом.

Вот смотри, классика жанра — TabLayout и ViewPager2:

val viewPager = findViewById<ViewPager2>(R.id.viewPager)
val tabLayout = findViewById<TabLayout>(R.id.tabLayout)

viewPager.adapter = MyPagerAdapter(this)  
TabLayoutMediator(tabLayout, viewPager) { tab, position ->  
    tab.text = "Tab ${position + 1}"  
}.attach()

А теперь по нюансам, которые в жизни всплывают:

  • Производительность: Если у тебя там фрагменты не из двух кнопок состоят, а целые космические корабли с анимациями и запросами в сеть, то FragmentStateAdapter — твой лучший друг. Иначе приложение начнёт бздеть и тормозить, как старый дедушкин Запорожец в горку.
  • Кастомизация: Ну, тут всё понятно. Хочешь иконки, хочешь бейджи с количеством непрочитанных сообщений (которых, конечно же, овердохуища), хочешь, чтобы таб при нажатии делал сальто — флаг в руки, делай. Но готовься к тому, что половина времени уйдёт не на логику, а на то, чтобы эта хитрая жопа вёрстки не разъезжалась на разных устройствах.
  • Jetpack Compose: Ну, если проект не с прошлого тысячелетия, то там уже всё по-взрослому. TabRow + Pager из Accompanist — красота. Хотя, признаться, когда только переходил, чувствовал себя немного полупидором, который забыл, как XML писать.

А бывает, что стандартного поведения не хватает. Например, нужно, чтобы табы при скролле куда-то прятались, а потом выпрыгивали. Вот тут уже приходится брать BottomNavigationView или тот же ConstraintLayout и колдовать, как Гарри Поттер. Главное — не наломать дров, а то получится не навигация, а манда с ушами, в которой и сам через пять минут не разберёшься.