Bottom Navigation: fundamentos, BottomNavigationView e TabView

Autor: IT Sectr Publicado: 2026-02-23 Tempo de leitura: 11 min

Bottom Navigation é um padrão de navegação onde o painel de alternância de seções fica localizado na parte inferior da tela. No Android é implementado via BottomNavigationView (Material 3), no iOS — via UITabBarController ou TabView no SwiftUI. Saiba mais sobre a especificação do Material Design na documentação do Material Design 3.

Principais pontos

  • Bottom Navigation — painel inferior para alternar entre 3–5 seções principais do aplicativo
  • BottomNavigationView — componente Android Material 3 com três modos de exibição de rótulos
  • TabView — contêiner embutido do SwiftUI para criar navegação inferior com abas
  • NavigationView + TabView — combinação para navegação em pilha dentro de cada aba
  • Material 3 — suporte a cores dinâmicas, animação de indicador e badges

O que é Bottom Navigation?

Bottom Navigation é um padrão de navegação onde as seções principais do aplicativo são acessíveis através de um painel na parte inferior da tela. Este padrão se tornou um padrão de design mobile devido à sua facilidade de uso com uma mão. Ao contrário de um menu lateral (Drawer), o Bottom Navigation está sempre visível e não requer gestos adicionais para abrir.

Material Design 3 (2026) define a Navigation Bar como um componente com três estados: default (ícone + rótulo), labeled (rótulo ampliado, uma aba ativa) e unlabeled (apenas ícones). O Google recomenda a Navigation Bar para aplicativos com 3–5 seções equivalentes. Para 6+ seções — Navigation Drawer. No iOS SwiftUI, o TabView usa automaticamente um painel inferior com estilo do sistema.

Um estudo da UX Movement (2025) mostrou que o Bottom Navigation melhora o tempo de conclusão de tarefas em 27% em comparação com um menu deslizante, pois o usuário vê todas as seções disponíveis sem ações adicionais. O número de toques incorretos diminui em 34% graças aos grandes alvos de toque (mínimo 48x48 dp no Android, 44x44 pt no iOS).

BottomNavigationView no Android (Material 3)

BottomNavigationView no Android é um componente da Material 3 Library (com.google.android.material.navigation.NavigationBarView). Ele substituiu o antigo BottomNavigationView do Material 2 e adicionou suporte a cores dinâmicas do Material You, indicador animado de aba ativa e badges embutidos. O componente é configurado através de um menu XML e é totalmente compatível com o Navigation Component.

kotlin
// Atividade com BottomNavigationView e NavHostFragment
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navView = findViewById<NavigationBarView>(R.id.nav_view)
        val navController = findNavController(R.id.nav_host_fragment)

        // Sincronização automática de navegação
        navView.setupWithNavController(navController)

        // Configuração do badge
        val badge = navView.getOrCreateBadge(R.id.navigation_messages)
        badge.number = 8
        badge.badgeGravity = BadgeDrawable.TOP_END
    }
}

// Menu XML para Bottom Navigation (res/menu/bottom_nav_menu.xml)
// <?xml version="1.0" encoding="utf-8"?>
// <menu xmlns:android="http://schemas.android.com/apk/res/android">
//   <item android:id="@+id/navigation_home"
//     android:icon="@drawable/ic_home"
//     android:title="Início" />
//   <item android:id="@+id/navigation_messages"
//     android:icon="@drawable/ic_chat"
//     android:title="Chats" />
//   <item android:id="@+id/navigation_profile"
//     android:icon="@drawable/ic_person"
//     android:title="Perfil" />
// </menu>

Material 3 NavigationBarView suporta três modos labelVisibilityMode: LABEL_VISIBILITY_AUTO (padrão — o rótulo é mostrado para a aba ativa), LABEL_VISIBILITY_LABELED (rótulos para todos), LABEL_VISIBILITY_UNLABELED (apenas ícones). O indicador animado de aba ativa é configurado através de itemActiveIndicatorStyle com um efeito ripple personalizado.

TabView no SwiftUI para iOS

TabView é um contêiner embutido do SwiftUI para criar navegação inferior. Cada aba é definida usando o modificador .tabItem com um ícone e texto. O TabView cria automaticamente um UITabBarController internamente e suporta todos os recursos nativos do painel: badges, cor do badge, animação de alternância e adaptação ao Dynamic Type.

swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        TabView {
            HomeView()
                .tabItem {
                    Label("Início", systemImage: "house.fill")
                }
                .badge(3)

            SearchView()
                .tabItem {
                    Label("Pesquisar", systemImage: "magnifyingglass")
                }

            NotificationsView()
                .tabItem {
                    Label("Notificações", systemImage: "bell.fill")
                }
                .badge("12")

            ProfileView()
                .tabItem {
                    Label("Perfil", systemImage: "person.circle.fill")
                }
        }
    }
}

TabView suporta o modificador .badge (iOS 15+), que aceita Int (badge numérico) ou String (badge de texto). A cor do badge pode ser alterada através de .badgeProminence(.increased) — torna o badge mais brilhante. A animação de alternância de abas é configurada através de .tabViewStyle(.automatic) ou estilos personalizados. Para controle programático de alternância, @State com selection é usado.

Combinação de navegação inferior e em pilha

Bottom Navigation raramente é usado sozinho — cada aba geralmente contém um navegador de pilha (NavigationView/NavigationStack no SwiftUI, NavHostFragment no Android). Esta combinação oferece ao usuário tanto acesso rápido às seções (Tab) quanto navegação profunda dentro de cada seção (Stack). Esta é a arquitetura padrão para aplicativos de produção.

swift
struct AppTabView: View {
    var body: some View {
        TabView {
            NavigationStack {
                HomeView()
            }
            .tabItem {
                Label("Início", systemImage: "house")
            }

            NavigationStack {
                SearchView()
            }
            .tabItem {
                Label("Pesquisar", systemImage: "magnifyingglass")
            }
        }
    }
}

// Dentro de HomeView — navegação em pilha
struct HomeView: View {
    var body: some View {
        List(items) { item in
            NavigationLink("\(item.title)", value: item)
        }
        .navigationDestination(for: Item.self) { item in
            ItemDetailView(item: item)
        }
    }
}

No Android, a mesma combinação é implementada através de NavHostFragment para cada aba. O Navigation Component automatiza a criação da pilha de retorno para cada aba: ao alternar abas, o estado da pilha é preservado, e ao retornar — é restaurado. Isso proporciona uma UX perfeita, como nos aplicativos do sistema Google (Play Market, YouTube).

Material 3: cores dinâmicas e animações

Material 3 (Material You) introduz uma mudança chave no Bottom Navigation — cores dinâmicas geradas a partir do papel de parede do usuário. O sistema extrai as cores dominantes do papel de parede e cria uma paleta de 5 tons chave. O NavigationBarView aplica automaticamente estas cores: a aba ativa recebe a cor primária, as inativas — a variante onSurface.

A animação do indicador de aba ativa tornou-se suave: ao alternar, o indicador anima-se em direção à nova aba com interpolação. O efeito ripple ao toque usa a cor secundária. Bottom Navigation no Material 3 também suporta animações personalizadas através de itemActiveIndicatorStyle — o desenvolvedor pode definir a forma (oval, retângulo), margens e cor do indicador.

xml
<!-- Estilo do indicador ativo do NavigationBarView -->
<style name="Widget.MyApp.NavigationBarView.ActiveIndicator"
    parent="Widget.Material3.NavigationBarView.ActiveIndicator">
    <item name="android:height">32dp</item>
    <item name="android:width">64dp</item>
    <item name="android:marginHorizontal">8dp</item>
    <item name="shapeAppearance">
        @style/ShapeAppearance.Material3.Corner.Full
    </item>
    <item name="color">@color/primary_container</item>
</style>

Recomendações UX para Bottom Navigation

Ao projetar Bottom Navigation, a pesquisa de usabilidade deve ser considerada. NN Group (2026): o painel inferior deve ter pelo menos 56 dp de altura, os alvos de toque — pelo menos 48 dp. O texto dos rótulos — máximo 12 caracteres (latim) ou 8 caracteres (cirílico). A aba ativa deve diferir não apenas na cor, mas também no estado do ícone (preenchido vs contorno).

Material Design 3 recomenda os seguintes padrões: 4 abas — ideal para fácil varredura; um ícone "+" no centro (FloatingActionButton) — para a ação principal; badges — apenas para contadores de ações do usuário. Evitar: usar Bottom Navigation com 2 abas (use Tab Layout em vez disso), alterar a ordem das abas dinamicamente, ocultar o painel em telas aninhadas.

  • Altura — mínimo 56 dp para alcance confortável do polegar
  • Contraste — a aba ativa deve ser distinguível (cor + preenchimento do ícone)
  • Rótulos — curtos, 1-2 palavras, sem truncamento (não mais que 12 caracteres)
  • Ordem — fixa, do mais importante ao menos importante
  • Contadores — apenas para notificações do usuário, não para marketing

Perguntas frequentes

Qual a diferença entre Bottom Navigation e Navigation Drawer?

Bottom Navigation — um painel na parte inferior da tela, sempre visível, para 3–5 seções equivalentes. Navigation Drawer — um menu lateral invocado por gesto ou botão, para 6+ seções, configurações e páginas secundárias. O Drawer esconde o conteúdo, o Bottom Navigation não.

Quantas abas são ideais para Bottom Navigation?

4 abas — ideal segundo dados do NN Group. 3 — mínimo para justificar um painel inferior. 5 — máximo onde todas as abas permanecem distinguíveis. 6+ requer mudar para Navigation Drawer ou um item "Mais" no iOS.

Como implementar um badge no BottomNavigationView?

No Android Material 3, use getOrCreateBadge(itemId) no NavigationBarView. Configure o número via badge.number e a posição via badgeGravity (TOP_END, TOP_START). No iOS SwiftUI — o modificador .badge(Int) no .tabItem. No UIKit — tabBarItem.badgeValue = "N".

É possível animar a alternância de abas?

Sim. O Material 3 NavigationBarView anima o movimento do indicador de aba ativa. O SwiftUI TabView usa a animação do sistema iOS. Para animações personalizadas de conteúdo, use matchedGeometryEffect (SwiftUI) ou Transition (Jetpack Compose). A animação do painel de alternância em si é do sistema.

Bottom Navigation é adequado para aplicações web?

Sim, para mobile-first e PWA. Material Design 3 tem um componente web Navigation Bar. No entanto, no desktop é melhor usar um painel lateral (Side Navigation) — o espaço horizontal permite mostrar mais itens. Bottom Navigation no desktop é um antipadrão.

Resumo

  • Bottom Navigation — padrão de navegação móvel padrão para 3–5 seções principais
  • NavigationBarView (Android Material 3) e TabView (iOS SwiftUI) — implementações modernas
  • Material 3 Dynamic Colors — geração automática de paleta de cores a partir do papel de parede do usuário
  • Tab + Stack — combinação de navegação inferior com navegação em pilha dentro de cada aba para arquitetura de produção
  • Animação do indicador — movimento suave do indicador ativo ao alternar abas
  • Regras UX — altura 56 dp, 4 abas, ordem fixa, aba ativa contrastante
  • Badges — suporte embutido para indicadores numéricos e de ponto em ambas as plataformas

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também