【Android -- 开源库】BottomNavigation 的基本使用

2023-11-08

一、简介

BottomNavigation 一个优秀的底部导航栏。
该库可帮助用户轻松使用底部导航栏(谷歌的一种新模式)并允许大量自定义

效果图

效果图

二、引入框架

1. 在 app/build.gradle 中添加:

implementation 'com.ashokvarma.android:bottom-navigation-bar:2.1.0'

三、使用

1. 布局文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".ui.BottomNavigationActivity">

    <include
        android:id="@+id/include4"
        layout="@layout/layout_toolbar"/>

    <FrameLayout
        android:id="@+id/fl_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toTopOf="@+id/bottom_navigation_bar"
        app:layout_constraintTop_toBottomOf="@+id/include4" />

    <com.ashokvarma.bottomnavigation.BottomNavigationBar
        android:id="@+id/bottom_navigation_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

2. java 代码
BottomNavigationActivity.java

public class BottomNavigationActivity extends BaseActivity implements BottomNavigationBar.OnTabSelectedListener {
    @BindView(R.id.bottom_navigation_bar)
    BottomNavigationBar mNavigationBar;

    private InviteFragment mInviteFragment = HomeFragmentFactory.getInstance().getInviteFragment();
    private ActivityFragment mActivityFragment = HomeFragmentFactory.getInstance().getActivityFragment();
    private FoundFragment mFoundFragment = HomeFragmentFactory.getInstance().getFoundFragment();
    private MineFragment mMineFragment = HomeFragmentFactory.getInstance().getMineFragment();

    private Fragment currentFragment = new Fragment();
//    private TextBadgeItem mBadgeItem;
    private FragmentManager fm;


    @Override
    protected int getLayoutId() {
        return R.layout.activity_bottom_navigation;
    }

    @Override
    protected void setToolbar() {

    }

    @Override
    protected void initView() {
        setNavTitle(R.string.bottom_navigation);

        fm = getSupportFragmentManager();

        initBottomBar();

    }

    private void initBottomBar() {

        /**
         * 导航基础设置 包括按钮选中效果 导航栏背景色等
         */
        mNavigationBar.setTabSelectedListener(this)
                .setMode(BottomNavigationBar.MODE_FIXED)
                .setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC)
                .setActiveColor("#F5DF3E")//选中颜色
                .setInActiveColor("#000000")//未选中颜色
                .setBarBackgroundColor("#ffffff");//导航栏背景色
//        mBadgeItem = new TextBadgeItem()
//                .setBorderWidth(2)//Badge的Border(边界)宽度
//                .setBorderColor(Color.BLUE)//Badge的Border颜色
//                .setBackgroundColor(Color.RED)
//                .setTextColor(Color.BLACK)//文本颜色
//                .setGravity(Gravity.RIGHT| Gravity.TOP)//位置,默认右上角
//                .setAnimationDuration(2000)
//                .setHideOnSelect(true)//当选中状态时消失,非选中状态显示
//                .setText("9");

        setInvite();


    }

    /**
     * 切换fragment
     *
     * @param targetFragment
     * @return
     */
    private FragmentTransaction switchFragment(Fragment targetFragment) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (!targetFragment.isAdded()) {
            // 第一次使用switchFragment()时currentFragment为null,所以要判断一下
            if (currentFragment != null) {
                transaction.hide(currentFragment);
            }
            transaction.add(R.id.fl_content, targetFragment, targetFragment.getClass().getName());
        } else {
            transaction.hide(currentFragment).show(targetFragment);
        }
        currentFragment = targetFragment;
        return transaction;
    }


    /**
     * 邀请
     */
    private void setInvite() {
        mNavigationBar.clearAll();
        switchFragment(mInviteFragment).commitNowAllowingStateLoss();
        mNavigationBar.addItem(new BottomNavigationItem(R.mipmap.icon_invite_nor,"邀约"))
                .addItem(new BottomNavigationItem(R.mipmap.icon_activity_nor,"活动"))
                .addItem(new BottomNavigationItem(R.mipmap.icon_find_nor,"发现"))
                .addItem(new BottomNavigationItem(R.mipmap.icon_my_nor,"我的"))
                .setFirstSelectedPosition(0)
                .initialise();

    }

    /**
     * 活动
     */
    private void setActivity() {
        mNavigationBar.clearAll();
        switchFragment(mActivityFragment).commitNowAllowingStateLoss();
        mNavigationBar.addItem(new BottomNavigationItem(R.mipmap.icon_invite_nor,"邀约"))
                .addItem(new BottomNavigationItem(R.mipmap.icon_activity_nor,"活动"))
                .addItem(new BottomNavigationItem(R.mipmap.icon_find_nor,"发现"))
                .addItem(new BottomNavigationItem(R.mipmap.icon_my_nor,"我的"))
                .setFirstSelectedPosition(1)
                .initialise();

    }

    /**
     * 发现
     */
    private void setFound() {
        mNavigationBar.clearAll();
        switchFragment(mFoundFragment).commitNowAllowingStateLoss();
        mNavigationBar.addItem(new BottomNavigationItem(R.mipmap.icon_invite_nor,"邀约"))
                .addItem(new BottomNavigationItem(R.mipmap.icon_activity_nor,"活动"))
                .addItem(new BottomNavigationItem(R.mipmap.icon_find_nor,"发现"))
                .addItem(new BottomNavigationItem(R.mipmap.icon_my_nor,"我的"))
                .setFirstSelectedPosition(2)
                .initialise();

    }

    /**
     * 我的
     */
    private void setMine() {
        mNavigationBar.clearAll();
        switchFragment(mMineFragment).commitNowAllowingStateLoss();
        mNavigationBar.addItem(new BottomNavigationItem(R.mipmap.icon_invite_nor,"邀约"))
                .addItem(new BottomNavigationItem(R.mipmap.icon_activity_nor,"活动"))
                .addItem(new BottomNavigationItem(R.mipmap.icon_find_nor,"发现"))
                .addItem(new BottomNavigationItem(R.mipmap.icon_my_nor,"我的"))
                .setFirstSelectedPosition(3)
                .initialise();

    }

    @Override
    public void onTabSelected(int position) {
        FragmentTransaction ft = fm.beginTransaction();
        switch (position) {
            case 0:
                setInvite();
                break;

            case 1:
                setActivity();
                break;

            case 2:
                setFound();
                break;

            case 3:
                setMine();
                break;
        }

    }

    @Override
    public void onTabUnselected(int position) {

    }

    @Override
    public void onTabReselected(int position) {

    }
}

四个类似的Fragment , ActivityFragment.java

public class ActivityFragment extends BaseFragment {
    @Override
    protected int getLayoutId() {
        return R.layout.fragment_activity;
    }
}

HomeFragmentFactory.java

/**
 * Created on 2019/12/2 16:44
 *
 * @author Gong Youqiang
 */
public class HomeFragmentFactory {
    static HomeFragmentFactory mInstance;
    private InviteFragment mInviteFragment;
    private ActivityFragment mActivityFragment;
    private FoundFragment mFoundFragment;
    private MineFragment mMineFragment;

    public HomeFragmentFactory() {
    }

    public static HomeFragmentFactory getInstance() {
        if (mInstance == null) {
            synchronized (HomeFragmentFactory.class) {
                if (mInstance == null) {
                    mInstance = new HomeFragmentFactory();
                }
            }
        }
        return mInstance;
    }

    /**
     * 邀请
     *
     * @return
     */
    public InviteFragment getInviteFragment() {
        if (mInviteFragment == null) {
            synchronized (InviteFragment.class) {
                if (mInviteFragment == null) {
                    mInviteFragment = new InviteFragment();
                }
            }
        }
        return mInviteFragment;
    }

    /**
     * 活动
     *
     * @return
     */
    public ActivityFragment getActivityFragment() {
        if (mActivityFragment == null) {
            synchronized (ActivityFragment.class) {
                if (mActivityFragment == null) {
                    mActivityFragment = new ActivityFragment();
                }
            }
        }
        return mActivityFragment;
    }

    /**
     * 发现
     *
     * @return
     */
    public FoundFragment getFoundFragment() {
        if (mFoundFragment == null) {
            synchronized (FoundFragment.class) {
                if (mFoundFragment == null) {
                    mFoundFragment = new FoundFragment();
                }
            }
        }
        return mFoundFragment;
    }

    /**
     * 我的
     *
     * @return
     */
    public MineFragment getMineFragment() {
        if (mMineFragment == null) {
            synchronized (MineFragment.class) {
                if (mMineFragment == null) {
                    mMineFragment = new MineFragment();
                }
            }
        }
        return mMineFragment;
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Android -- 开源库】BottomNavigation 的基本使用 的相关文章

  • 消息中间件(MQ)

    一 什么是消息中间件 关注于数据的发送和接收 利用高效可靠的异步消息传递机制集成分布式系统 通过提供消息传递和消息排队模型 它可以在分布式环境下扩展进程间的通信 二 为什么需要消息中间件 1 系统解耦 假设你有个系统A 这个系统A会产出一个
  • 数据治理总结

    项目背景 前提 参与人员均了解熟悉数据中心 业务痛点 始于一次吐槽大会 1 开发及使用人员信息不对称 2 表中字段增减随意 3 相似数据冗余 4 定制化表过多 扩展功能不足 维护成本高 5 缺少注释 全凭猜测 浪费时间 项目计划 1 确定治
  • [North Central NA Contest 2018] Rational Ratio

    Description Every positive rational number can be expressed as a ratio of two positive integers However in decimal form
  • 【目标检测】Towards Accurate One-Stage Object Detection with AP-Loss

    摘要 one stage目标探测器通过同时优化分类损失和定位损失进行训练 前者由于锚的数量众多而遭受极端的前景 背景类别失衡问题 本文提出了一个新颖的框架 以分级任务代替one stage检测器中的分类任务 并采用平均精度损失 AP los
  • flink学习39:tableAPI应用实例

    实例
  • linux下串口的安装和使用(ubuntu+usb转串口)

    转自 http blog csdn net u014416516 article details 39482183 安装 在终端中输入sudo apt get install minicom 配置 输入sudo minicom s 注意前边
  • 成功 打不开_【2019】Adobe XD 闪退白屏打不开的解决方法

    原文是微信公众号文章 原文链接 2019 关于 Adobe XD 闪退白屏打不开的解决方法 mp weixin qq com Adobe XD 作为一款战略地位超越 Photoshop 的一站式 UI UX 设计平台软件 每天有无数 UI
  • 电路(1) ——LC谐振电路

    最近小菜转行了 不再做软开 博客会更新一些电路分析的内容 从零开始学电分的第一天 加油
  • 元宇宙改变人类工作模式的四种方式

    想象一个世界 你可以与同事在海边交谈 在空间站周围漂浮时做会议记录 或者从你在伦敦的办公室传送到纽约 所有这些都无需走出你的前门 由于今天安排的会议太多而感到压力 那么为什么不发送支持 AI 的数字双胞胎来减轻你的负担呢 这些例子只是对 元
  • Echarts图表不显示

    Echarts图表不显示 div标签的style属性设置有问题 div style width 500px height 500px div
  • C++课程基础语法小结

    前言 每个人的记忆是有限的 学过的东西很快就会遗忘 因此 在即将升大二之际 对大一学习的C 的基础语法进行整理归纳 并附上一年里写过的一些重要代码 方便今后回顾 声明 本文参考教材提供的网络学习资料 非常感谢 网址已注明 代码为博主本人大一
  • 人体活动识别总结

    人体活动识别 活动识别过程 数据采集 数据预处理 窗口分割 特征提取 特征选择 活动分类 面临问题 人类活动识别 HAR 仍有许多问题促使新技术的发展 以提高在更现实的条件下的准确性 其中一些挑战是 1 要度量的属性选择 2 便携的 不显眼
  • 3D开发-PhotoScan 模型生成

    PhotoScan是一款图片转3D模型软件 需要商业license 其图片转3D模型效果非常好 是一款基于影响自动生成高质量三维模型的优秀软件 这对于3D建模需求来说实在是一把利器 图片转3D模型操作 Step1 选择工作流程 Step2
  • 虚拟现实(VR)在医疗保健中的5种应用

    医疗保健中的VR虚拟现实 虚拟现实的由来已久 18世纪 法国的医生使用布制的分娩模拟器向助产师和外科医生教授医学技术 在20世纪60年代初 医生一边对心肺复苏学员口述心肺复苏的技巧 一边使用一家塑料玩具厂家制造的塑料娃娃现场演示胸部按压和人
  • 安全(四):CSRF攻击

    csrf获取的不是用户的所有权限 获取的是用户在修改东西的时候 通过url权限修改信息 查看这里
  • MySQL-面试题

    第六章 决胜秋招 Section A 练习一 各部门工资最高的员工 难度 中等 创建Employee 表 包含所有员工信息 每个员工有其对应的 Id salary 和 department Id Id Name Salary Departm

随机推荐

  • 已知树的中序序列和先序/后序序列,求树的结构?

    已知树的中序序列和先序 后序序列 求树的结构 这类问题比较经典了 刚好CSDN上有人问起 所以自己写了一个递归算法 根据中序和先序 后序 建立树结构 这里需要说明的是 必须要知道中序序列 先序和后序可选的情况下才能推导出树结构 只知道后序先
  • Springboot毕设项目二手手机回收系统2r40d(java+VUE+Mybatis+Maven+Mysql)

    Springboot毕设项目二手手机回收系统2r40d java VUE Mybatis Maven Mysql 项目运行 环境配置 Jdk1 8 Tomcat8 5 Mysql HBuilderX Webstorm也行 Eclispe I
  • selenium三种等待方式详解

    一 场景 我们在做WEB自动化时 一般要等待页面元素加载完成后 才能执行操作 否则会报找不到元素的错误 这样就要求我们在有些场景下加等待时间 二 强制等待 1 利用time模块的sleep方法来实现 最简单粗暴的方法 2 不管浏览器是否加载
  • 关于RecyclerView一系列问题汇总

    今天主要分享的主要是使用recyclerview添加item 删除item的一些问题的汇总 后续持续更新 开发多年一直在使用BaseRecyclerViewAdapterHelper这个库 就拿这个来举例 添加item mAdapter a
  • 解决 ModuleNotFoundError: No module named 'pip'

    今天 安装其它python包时 提示说 pip 10 0 1可用 就更新了一下 但是 更新过程中出现了错误 如图所示 因为这个错误导致 pip找不到 可以首先执行 python m ensurepip 然后执行 python m pip i
  • 【Redis】五种数据结构的常用命令,及多种应用场景示例

    Redis 是一个开源 高级的键值存储和一个适用的解决方案 用于构建高性能 可扩展的 Web 应用程序 Redis 也被作者戏称为数据结构服务器 这意味着使用者可以通过一些命令 基于带有 TCP 套接字的简单 服务器 客户端 协议来访问一组
  • 电池并联防止接反电路设计

    缘由两节电池并联电路如何实现可靠的防反接效果 电源技术论坛 电子技术论坛 广受欢迎的专业电子论坛
  • 关于静态变量与非静态变量的区别

    public class Cluster private static String id 与 public class Cluster private String id 的不同 前者中定义的是静态变量id 这个变量在类加载 不是new
  • 原生安卓继承uniapp后执行自定义的applicaiton与activity(实现双击退出按钮监听)

    一 自定义application 乱起八糟的不用管 1 MyApplication java public class MyApplication extends DCloudApplication Override public void
  • 【QT 网络云盘客户端】——实现文件属性窗口

    目录 文件属性对话框 设置字体样式 获取文件的信息 显示文件属性对话框 当我们点击文件中的属性 则会弹出一个属性对话框 实现过程 0 设置 属性 菜单项的槽函数 1 鼠获取鼠标选中的QListWidgetItem 它包含 图标和文件名 2
  • Java高级开发的50个性能优化

    在JAVA程序中 性能问题的大部分原因并不在于JAVA语言 而是程序本身 养成良好的编码习惯非常重要 能够显著地提升程序性能 1 尽量在合适的场合使用单例 使用单例可以减轻加载的负担 缩短加载的时间 提高加载的效率 但并不是所有地方都适用于
  • 李沐老师动手学深度学习v2中 LeNet实现中遇到的运行报错问题以及无法显示动态图片问题

    问题一 RuntimeError DataLoader worker pid s 4088 9912 220 exited unexpectedly报错问题 报错原因 Windows不支持多线程 在运行下面这句时调用了get dataloa
  • redis单线程模型为什么这么高效

    一 为什么Redis是单线程的 Redis 是基于内存的操作 而CPU 不是 Redis 的瓶颈 Redis 的瓶颈最有可能是机器内存的 大小或者网络带宽 同时 单线程的实现更加简单和经济 采用单线程可以使指令串行 不用额外 维护锁机制 避
  • vs创建c语言项目

    vs创建c语言项目 已知用c 做一些简单的开发 以前虽然也捅咕过C和C 但是好久不上手了 现在用VS都不知道怎么创建C项目 首先打开VS程序 选择新建一个项目 然后在里面选择C 新建win32控制台程序 下面的哪些名字和路径 改了项目名就行
  • [SQL Server] TSQL实现SQL Server中CTE 递归查询

    参考博客 https www cnblogs com ljhdo p 4580347 html 简介 递归查询主要应用于层级结构表的查询 叶节点 gt 根节点的查询 根节点 gt 叶节点的查询 递归查询必须满足的条件 初始条件 递归查询至少
  • vue-使用js创建组件--render函数

    vue cli 使用js创建组件 render函数 template 怎么被写成一个页面的 一般使用组件 我们也可以使用JS创建一个组件 template 怎么被写成一个页面的 template 被 vue template compile
  • IDEA如何自动生成类图

    IDEA自动生成类图 第一步 在file里面找到setting 第二步 搜索diagrams 第三步 勾选类图的属性 1 成员变量 2 构造器 3 方法 4 配置文件 5 内部类 第四步 第五步 第六步 第七步 自动生成
  • C++实现字符串去掉前后的空格

    今天遇到一个需求 需要去除字符串前后的空格 因为std string本身没有去除空格的函数 因此自己写了一个 如下 string trimmed const string data int lPos data find first not
  • 本地安装和利用docker安装DVWA

    本地安装DVWA 打开phpstudy 找到创建网站 并设置数据如下图 打开网站根目录 放入DVWA的zip数据包并解压 DVWA的文件下载网站 网站链接点这 放入目录中 然后修改文件config 先备份好文件config inc php
  • 【Android -- 开源库】BottomNavigation 的基本使用

    一 简介 BottomNavigation 一个优秀的底部导航栏 该库可帮助用户轻松使用底部导航栏 谷歌的一种新模式 并允许大量自定义 效果图 二 引入框架 1 在 app build gradle 中添加 implementation c