当前位置:首页 > 行业动态 > 正文

安卓底部导航栏 api

使用BottomNavigationView实现底部导航栏

添加依赖

build.gradle中引入Material Components库:

implementation 'com.google.android.material:material:1.9.0'

布局文件配置

在Activity布局文件中添加BottomNavigationView

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottom_nav"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:menu="@menu/bottom_nav_menu" />

创建菜单资源

res/menu目录下创建bottom_nav_menu.xml

安卓底部导航栏 api  第1张

<menu>
    <item
        android:id="@+id/navigation_home"
        android:icon="@drawable/ic_home"
        android:title="首页" />
    <item
        android:id="@+id/navigation_search"
        android:icon="@drawable/ic_search"
        android:title="搜索" />
    <item
        android:id="@+id/navigation_profile"
        android:icon="@drawable/ic_profile"
        android:title="我的" />
</menu>

处理导航点击事件

基础事件监听

在Activity中设置OnNavigationItemSelectedListener

BottomNavigationView bottomNav = findViewById(R.id.bottom_nav);
bottomNav.setOnNavigationItemSelectedListener(item -> {
    switch (item.getItemId()) {
        case R.id.navigation_home:
            // 跳转到首页
            break;
        case R.id.navigation_search:
            // 跳转到搜索页
            break;
        case R.id.navigation_profile:
            // 跳转到个人页
            break;
    }
    return true;
});

与Fragment结合(推荐方式)

使用Fragment替换容器并管理选中状态:

// 初始化默认选中项
bottomNav.setSelectedItemId(R.id.navigation_home);
// 处理点击事件
bottomNav.setOnNavigationItemSelectedListener(item -> {
    Fragment fragment = null;
    switch (item.getItemId()) {
        case R.id.navigation_home:
            fragment = new HomeFragment();
            break;
        case R.id.navigation_search:
            fragment = new SearchFragment();
            break;
        case R.id.navigation_profile:
            fragment = new ProfileFragment();
            break;
    }
    if (fragment != null) {
        getSupportFragmentManager().beginTransaction()
            .replace(R.id.fragment_container, fragment)
            .commit();
    }
    return true;
});

与Jetpack Navigation组件集成

配置NavGraph

nav_graph.xml中定义底部导航对应的NavDestination

<nav-graph>
    <fragment android:name=".HomeFragment" />
    <fragment android:name=".SearchFragment" />
    <fragment android:name=".ProfileFragment" />
</nav-graph>

绑定NavController

在Activity中关联BottomNavigationViewNavController

NavController navController = Navigation.findNavController(this, R.id.fragment_container);
bottomNav.setupWithNavController(navController);

关键属性与自定义配置

属性名 说明 示例值
app:menu 指定菜单资源 @menu/bottom_nav_menu
app:itemIconTint 图标选中/未选中颜色 @color/selector_nav_icon_tint
app:itemTextColor 文字选中/未选中颜色 @color/selector_nav_text_tint
app:labelVisibilityMode 文字显示模式(始终/选中时/永不) labeled/selected/unlabeled

常见问题与解决方案

图标尺寸/颜色自定义

  • 问题:默认图标大小或颜色不符合设计要求。
  • 解决:通过itemIconTint设置颜色选择器,或使用drawable资源自定义图标。

处理返回键逻辑

  • 问题:按返回键时需退出应用而非返回上一页。
  • 解决:在Activity中重写onBackPressed,判断当前Fragment是否为首个页面。

相关问题与解答

问题1:如何动态修改底部导航栏的菜单项?

解答:通过BottomNavigationView.getMenu()获取菜单对象,调用add()remove()方法操作。

Menu menu = bottomNav.getMenu();
menu.removeItem(R.id.navigation_search); // 移除搜索项

问题2:底部导航栏与沉浸式状态栏冲突怎么办?

解答:在AndroidManifest.xml中设置android:fitsSystemWindows="true",并在布局中为父容器添加paddingTop,或使用WindowInsetsController动态调整

0