Android Material Design 系列之 BottomNavigationView + ViewPager + Fragment + BadgeView 开发详解

前言

BottomNavigationView 是 Material Design 提供的一个标准底部导航栏的实现,可以轻松的实现导航栏菜单之间的切换与浏览。底部导航使用户更方便的查看和切换最高层级的导航界面,适用于有三到五个 Tab 的情况

APP 底部导航栏目中,有新消息提示用户,并在导航栏底部显示具体消息数,这种效果主流 APP 都有应用。本文就介绍 BottomNavigationView + ViewPager + Fragment + BadgeView 可以达到微信消息角标效果和 QQ 消息拖拽效果。

在这里插入图片描述

一、BottomNavigationView 相关属性

方法 介绍
setSelectedItemId(int itemId) 设置选择的菜单项 ID
setElevation(float elevation) 设置此视图的基本高程(以像素为单位)
setItemBackground(Drawable background) 将菜单项的背景设置为给定的可绘制对象
setItemBackgroundResource(int resId) 将菜单项的背景设置为给定资源
setItemIconSize(int iconSize) 设置大小以提供菜单项图标
setItemIconTintList(ColorStateList tint) 设置应用于菜单项图标的色彩
setItemRippleColor(ColorStateList itemRippleColor) 将菜单项的背景设置为具有给定颜色的波纹
setItemTextAppearanceActive(int textAppearanceRes) 设置用于菜单项标签的文本样式
setItemTextAppearanceInactive(int textAppearanceRes) 设置用于非活动菜单项标签的文本样式
setItemTextColor(ColorStateList textColor) 设置颜色以用于菜单项文本的不同状态(正常,选中,聚焦等)
setLabelVisibilityMode(int labelVisibilityMode) 设置导航项目的标签可见性模式
setItemHorizontalTranslationEnabled(boolean itemHorizontalTranslationEnabled) 设置当合并的项目宽度填满屏幕时,菜单项是否在选择时水平平移
setOnNavigationItemReselectedListener(BottomNavigationView.OnNavigationItemReselectedListener listener) 设置一个侦听器,当重新选择当前选择的底部导航项时将通知该侦听器
getMenu() 返回 Menu 与此底部导航栏关联的实例
getMaxItemCount() 返回最大 Menu 数量

二、BottomNavigationView 基础使用

1、依赖引入

implementation 'com.android.support:design:29.0.0'

2、XML 布局文件

在 xml 布局文件中直接引入控件

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

3、menu 创建

BottomNavigationView 需要添加一个 menu 布局,之前在 DarwerLayout+NavigationView 文章中讲过 menu 创建注意事项,底部导航栏使用至少需要 android:id、android:icon、android:title 三个属性,此处就不做具体讲解,直接附上代码:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_item_home"
        android:icon="@drawable/ic_vector_bottom_home"
        android:title="主页" />

    <item
        android:id="@+id/menu_item_project"
        android:icon="@drawable/ic_vector_bottom_book"
        android:title="项目" />

    <item
        android:id="@+id/menu_item_movie"
        android:icon="@drawable/ic_vector_bottom_movie"
        android:title="电影" />
</menu>

4、三个以上 Tab 文本与动画效果

经过以上三步,基本上就可以看到 BottomNavigationView 的展示效果,但是发现 3 个以上菜单时会出现文本显示异常现象,动画效果也变了。要想解决这个问题,在最新版的 API 中,已经为大家提供了解决方案,只需要一行代码就可以完美解决。

bottomNavigationView.setLabelVisibilityMode(LABEL_VISIBILITY_LABELED);
//或者在xml文件中使用属性
app:labelVisibilityMode="labeled"

因为本文是根据 androidx 讲解,如果需要旧版本兼容,使用以下方法:

public static void disableShiftMode(BottomNavigationView view) {
   
    BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
    try {
   
        Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
        shiftingMode.setAccessible(true);
        shiftingMode.setBoolean(menuView, false);
        shiftingMode.setAccessible(false);
        for (int i = 0; i < menuView.getChildCount(); i++) {
   
            B
  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
ActivityMainMenuBinding + BottomNavigationView + ViewPager2可以实现底部导航栏与ViewPager2的联动。下面是一个示例代码: ```java // 在Activity中使用DataBinding绑定布局 ActivityMainMenuBinding binding = ActivityMainMenuBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); // 设置ViewPager2适配器 ViewPager2 viewPager = binding.viewPager; viewPager.setAdapter(new MyPagerAdapter(this)); // 设置BottomNavigationViewViewPager2的联动 BottomNavigationView bottomNavigationView = binding.bottomNavigationView; bottomNavigationView.setOnNavigationItemSelectedListener(item -> { switch (item.getItemId()) { case R.id.menu_home: viewPager.setCurrentItem(0); return true; case R.id.menu_dashboard: viewPager.setCurrentItem(1); return true; case R.id.menu_notifications: viewPager.setCurrentItem(2); return true; } return false; }); // 监听ViewPager2的页面切换事件,实现与BottomNavigationView的联动 viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected(int position) { switch (position) { case 0: bottomNavigationView.setSelectedItemId(R.id.menu_home); break; case 1: bottomNavigationView.setSelectedItemId(R.id.menu_dashboard); break; case 2: bottomNavigationView.setSelectedItemId(R.id.menu_notifications); break; } } }); ``` 这段代码使用了DataBinding绑定了名为`ActivityMainMenuBinding`的布局文件。在布局文件中,包含了一个`ViewPager2`和一个`BottomNavigationView`。通过设置`ViewPager2`的适配器和监听器,以及`BottomNavigationView`的选中监听器和`ViewPager2`的页面切换监听器,实现了底部导航栏与ViewPager2的联动。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值