Ответ
Да, работал с приложениями с 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 и колдовать, как Гарри Поттер. Главное — не наломать дров, а то получится не навигация, а манда с ушами, в которой и сам через пять минут не разберёшься.