Android开发之底部导航栏的快速实现


Posted in Java/Android onApril 28, 2022

Tint 着色器

优点:去除“无用”图片,节省空间

配合BottomNavigationView,实现一个快速,简洁的Tab栏

传统做法:Tab 切换,字体变色、图片变色。至少给我提供八张图,四张默认,四张选中,然后通过 selector 文件设置

现在BottomNavigationView只需四张图!!!

Android开发之底部导航栏的快速实现

Android开发之底部导航栏的快速实现

依赖(AndroidX)

implementation 'com.google.android.material:material:1.1.0-alpha01'

布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:background="@color/white"
    tools:context=".MainActivity">
    <FrameLayout
        android:id="@+id/fLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/nav_bottom_menu"
        android:background="@color/bg" />
    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:layout_above="@+id/nav_bottom_menu"
        android:background="#FFE1E0E0" />
    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nav_bottom_menu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        app:itemBackground="@null"
        app:itemIconTint="@color/tint_selector_menu_color"
        app:itemTextColor="@color/tint_selector_menu_color"
        app:labelVisibilityMode="labeled"
        app:menu="@menu/nav_bottom_menu" />
    <com.makeramen.roundedimageview.RoundedImageView
        android:layout_width="55dp"
        android:layout_height="55dp"
        android:layout_alignParentBottom="true"
        android:layout_centerInParent="true"
        android:layout_marginBottom="12dp"
        android:src="@drawable/ic_log"
        app:riv_corner_radius="200dp" />
</RelativeLayout>

编写渲染颜色选择器-tint_selector_menu_color

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/orange" android:state_checked="true" />
    <item android:color="@color/black" />
</selector>

menu 文件中 icon-nav_bottom_menu

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/iv_home"
        android:icon="@drawable/iv_home"
        android:title="首页" />
    <item
        android:id="@+id/iv_wechat"
        android:icon="@drawable/iv_wechat"
        android:title="视频" />
    <item
        android:id="@+id/riv_script"
        android:icon="@null"
        android:title="@null" />
    <item
        android:id="@+id/iv_pipi"
        android:icon="@drawable/iv_pipi"
        android:title="电影" />
    <item
        android:id="@+id/iv_mine"
        android:icon="@drawable/iv_mine"
        android:title="我的" />
</menu>

BottomNavigationView的点击事件

这里配合Fragmen

/* Menu显示彩色图标 */
        //navBottomMenu.setItemIconTintList(null);
 /* 导航栏点击事件 */
        navBottomMenu.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.iv_home: {
                        FragmentManager.startFragmentHome(Fragment_A.class);
                        return true;
                    }
                    case R.id.iv_wechat: {
                        FragmentManager.startFragmentHome(Fragment_B.class);
                        return true;
                    }
                    case R.id.iv_pipi: {
                        FragmentManager.startFragmentHome(Fragment_C.class);
                        return true;
                    }
                    case R.id.iv_mine: {
                        FragmentManager.startFragmentHome(Fragment_D.class);
                        return true;
                    }
                    default:
                        break;
                }
                return false;
            }
        });

配合ViewPager实现Tab栏

/* 限制页面数,防止界面反复重新加载  */
    viewPager.setOffscreenPageLimit(4);
 // ViewPager 滑动事件监听
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {
            }
            @Override
            public void onPageSelected(int i) {
            //这里我做了中间凹凸按钮,所以要特别处理以下
            //如果没有我这种情况的,直接加上这个  navBottomMenu.getMenu().getItem(i).setChecked(true); 就不用再加switch语句了
                switch (i) {
                    case 0:
                        //将滑动到的页面对应的 menu 设置为选中状态
                        navBottomMenu.getMenu().getItem(i).setChecked(true);
                        break;
                    case 1:
                        //将滑动到的页面对应的 menu 设置为选中状态
                        navBottomMenu.getMenu().getItem(i).setChecked(true);
                        break;
                    case 2:
                    case 3:
                        //将滑动到的页面对应的 menu 设置为选中状态
                        navBottomMenu.getMenu().getItem(i + 1).setChecked(true);
                        break;
                    default:
                        break;
                }
            }
            @Override
            public void onPageScrollStateChanged(int i) {
            }
        });
    }

对应的适配器

(仅供参考,大家也可以去参考以下别人写的代码)

public class FragPagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragmentList;
    public FragPagerAdapter(@NonNull FragmentManager fm, List<Fragment> fragmentList) {
        super(fm);
        this.fragmentList = fragmentList;
    }
    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }
    @Override
    public int getCount() {
        return fragmentList.size();
    }
}

BottomNavigationView实现的Tab栏,比自己以前写的代码更加简洁明了!以上就是Android开发快速实现底部导航栏示例的详细内容!


Tags in this post...

Java/Android 相关文章推荐
详解Java实现设计模式之责任链模式
Jun 23 Java/Android
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
Jun 26 Java/Android
JavaWeb Servlet实现网页登录功能
Jul 04 Java/Android
java设计模式--七大原则详解
Jul 21 Java/Android
Android自定义ScrollView实现阻尼回弹
Apr 01 Java/Android
Java 超详细讲解十大排序算法面试无忧
Apr 08 Java/Android
JAVA长虹键法之建造者Builder模式实现
Apr 10 Java/Android
SpringBoot 集成短信和邮件 以阿里云短信服务为例
Apr 22 Java/Android
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
Apr 24 Java/Android
Android RecyclerView实现九宫格效果
Jun 28 Java/Android
SpringBoot详解执行过程
Jul 15 Java/Android
Java代码规范与质量检测插件SonarLint的使用
Aug 05 Java/Android
Java8 CompletableFuture 异步回调
Apr 28 #Java/Android
Springboot-cli 开发脚手架,权限认证,附demo演示
Apr 28 #Java/Android
Java 异步任务计算FutureTask
Apr 28 #Java/Android
带你了解Java中的ForkJoin
Android 界面一键变灰 深色主题工具类
mybatis-plus模糊查询指定字段
Spring Data JPA框架Repository自定义实现
Apr 28 #Java/Android
You might like
PHP中用hash实现的数组
2011/07/17 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
php接口隔离原则实例分析
2019/11/11 PHP
jquery api参考 visualjquery 中国线路 速度快
2007/11/30 Javascript
js利用Array.splice实现Array的insert/remove
2009/01/13 Javascript
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
js定时器实例分享
2016/12/20 Javascript
Javascript for in的缺陷总结
2017/02/03 Javascript
Ionic+AngularJS实现登录和注册带验证功能
2017/02/09 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
安装Node.js并启动本地服务的操作教程
2018/05/12 Javascript
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
了解JavaScript表单操作和表单域
2019/05/27 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
Python中获取网页状态码的两个方法
2014/11/03 Python
使用python实现rsa算法代码
2016/02/17 Python
Python3处理HTTP请求的实例
2018/05/10 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
python文字转语音的实例代码分析
2019/11/12 Python
python seaborn heatmap可视化相关性矩阵实例
2020/06/03 Python
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
房产销售员2015年终工作总结
2015/10/22 职场文书
2016年公务员六五普法心得体会
2016/01/21 职场文书