BottomNavigationView结合ViewPager搭建流行UI框架

底部菜单控件BottomNavigationView的使用 BottomNavigationView实现底部导航栏的整体效果如下图所示: 基本使用 BottomNavigationView控件的主要属性含义: 控件点击时候颜色选择@color/sl_color_green_grey 完整的MainActivity代码 运行的效果图如下: item多的时候,指的是item非选中状态显示文字,有以下几个值:它们依次运行如下图所示 auto和select和i 属性sShifting有关 此时isShifting=true;你会发现auto和 selected的效 阅读详情


BottomNavigationView是Google推出的底部导航栏组件,在没有这些底部导航组件之前,Android开发者多使用的是RadioGroup,在上一个项目开发中我们使用了Google的BottomNaviationView与ViewPager相结合搭建了UI框架,现项目已经完成,总结如下:

使用BottomNaviationView需要添加依赖库:

在app moudle 里面的build.gradle文件中,dependencies节点下面添加如下依赖:

compile 'com.android.support:design:25.3.0'
添加完依赖我们便可以在布局文件中使用了,activity_main.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.qj.simpleuiframe.MainActivity">

    <!--状态栏-->
    <View
        android:layout_width="match_parent"
        android:layout_height="24dp"
        android:background="@color/color661BB5D7"/>

    <!--标题栏-->
    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@color/color1BB5D7"
        android:gravity="center"
        android:textColor="@color/colorFFFFFF"
        android:textSize="20sp"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <!--底部导航栏-->
    <android.support.design.widget.BottomNavigationView
        android:id="@+id/bnv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?android:attr/windowBackground"
        app:itemIconTint="@drawable/tab_text_color_selector"
        app:itemTextColor="@drawable/tab_text_color_selector"
        app:menu="@menu/navigation"/>
</LinearLayout>
先说说底部导航栏BottomNaviationView:
app:menu="@menu/navigation" 这句说明:在我们的res文件夹下面有一个menu文件夹,menu文件夹里面有一个navigation文件,里面是关于我们底部导航栏的信息

我们来看看这个navigation.xml文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/tab_one"
        android:icon="@drawable/tab_one_selector"
        android:title="@string/tab_one"/>

    <item
        android:id="@+id/tab_two"
        android:icon="@drawable/tab_two_selector"
        android:title="@string/tab_two"/>

    <item
        android:id="@+id/tab_three"
        android:icon="@drawable/tab_three_selector"
        android:title="@string/tab_three"/>
</menu>
我们看到里面总共有三个导航按钮,我们以第一个为例做一下简单的说明:
id和title属性很简单,我们看一下icon属性,我们平时的底部导航按钮都是上图下文形式的(大多情况是这样),下面的文字是由我们的title属性指定的,上面的图片则是由我们这里的icon属性所决定的,我们看一看这个很简单的tab_one_selector选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/commend_select" android:state_pressed="true"/>
    <item android:drawable="@mipmap/commend_select" android:state_selected="true"/>
    <item android:drawable="@mipmap/commend"/>
</selector>
到这app:menu="@menu/navigation" 就说完了
下面说一下

app:itemIconTint="@drawable/tab_text_color_selector"
app:itemTextColor="@drawable/tab_text_color_selector"

app:itemIconTint是设置底部导航按钮图标颜色的属性

app:itemTextColor是设置底部导航按钮文字颜色的属性

由于大多情况下图标和文件颜色都是相同的(为了统一风格样式),所以它们两个我用的是同一个颜色选择器

说到这BottomNaviationView这个控件就说完了,下面解释一下activity_main.xml文件中的状态栏控件,在布局中写状态栏的原因是因为我们的应用主题是没有ActionBar并且状态栏是透明的,所以状态栏和标题栏需要我们自己来写(也是为了满足用户定义不同样式的状态栏和标题栏的要求)

下面看一下appTheme这一主题:

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- 全屏、无标题栏、状态栏透明 -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowTranslucentStatus">true</item>
    </style>
可以看到AppTheme的父主题是没有ActionBar的,而且我们还设置了它的的windowTranslucentStatus为true,即状态栏透明
这样我们的Activity就完全全屏了,没了状态栏和标题栏,我们就可以自己定义状态栏和标题栏了!

到这里activity_main.xml文件就说完了,下面看一下MainActivity.java中的代码

public class MainActivity extends FragmentActivity implements BottomNavigationView.OnNavigationItemSelectedListener, ViewPager.OnPageChangeListener {

    private ViewPager mViewPager;
    private BottomNavigationView mBottomNavigationView;
    private TextView mTitle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        initListener();
    }

    private void initView() {
        mTitle = (TextView) findViewById(R.id.title);
        mBottomNavigationView = (BottomNavigationView) findViewById(R.id.bnv);
        mViewPager = (ViewPager) findViewById(R.id.viewpager);
    }

    private void initData() {
    }

    private void initListener() {
        mBottomNavigationView.setOnNavigationItemSelectedListener(this);
        //系统默认选中第一个,但是系统选中第一个不执行onNavigationItemSelected(MenuItem)方法,如果要求刚进入页面就执行clickTabOne()方法,则手动调用选中第一个
        mBottomNavigationView.setSelectedItemId(R.id.tab_one);//根据具体情况调用
        mViewPager.addOnPageChangeListener(this);
        //为viewpager设置adapter
        mViewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        //BottomNaviationView和ViewPager联动,当BottomNaviationView的某个tab按钮被选中了,同时设置ViewPager对应的页面被选中
        int itemId = item.getItemId();
        switch (itemId) {
            case R.id.tab_one:
                clickTabOne();
                return true;//返回true,否则tab按钮不变色,未被选中
            case R.id.tab_two:
                clickTabTwo();
                return true;
            case R.id.tab_three:
                clickTabThree();
                return true;

            default:
                break;
        }
        return false;
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }

    @Override
    public void onPageSelected(int position) {
        //ViewPager和BottomNaviationView联动,当ViewPager的某个页面被选中了,同时设置BottomNaviationView对应的tab按钮被选中
        switch (position) {
            case 0:
                mBottomNavigationView.setSelectedItemId(R.id.tab_one);
                break;
            case 1:
                mBottomNavigationView.setSelectedItemId(R.id.tab_two);
                break;
            case 2:
                mBottomNavigationView.setSelectedItemId(R.id.tab_three);
                break;

            default:
                break;
        }
    }

    @Override
    public void onPageScrollStateChanged(int state) {
    }

    private void clickTabOne() {
        //为防止隔页切换时,滑过中间页面的问题,去除页面切换缓慢滑动的动画效果
        mViewPager.setCurrentItem(0, false);
        mTitle.setText("One");
    }

    private void clickTabTwo() {
        mViewPager.setCurrentItem(1, false);
        mTitle.setText("Two");
    }

    private void clickTabThree() {
        mViewPager.setCurrentItem(2, false);
        mTitle.setText("Three");
    }
}
代码中都有详细的注释,这里就不多说了,这里说一下ViewPager设置适配器,代码中创建了ViewPagerAdapter对象
public class ViewPagerAdapter extends FragmentPagerAdapter {
    //由于页面已经固定,故这里把Adapter需要的fragment提前创建
    private Fragment[] mFragments = new Fragment[]{new OneFragment(), new TwoFragment(), new ThreeFragment()};

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragments[position];
    }

    @Override
    public int getCount() {
        return 3;
    }
}
ViewPagerAdapter对象中创建了它所需要的所有fragment对象,这里由于是演示说明,所以Fragment页面也很简单,代码就不贴了(最后会提供下载地址)
到这我们的BottomNaviationView与ViewPager相结合搭建的流行UI框架已经完成了!


项目下载链接

.apk文件下载


如果系统自带的BottomNaviationView不能满足您的项目需求,建议您看看github一位大神封装的一个BottomNaviationView的增强库:

BottomNaviationViewEx

BottomNavigationView结合ViewPager搭建流行UI框架,2021腾讯Android面试题精选 app:itemIconTint是设置底部导航按钮图标颜色的属性 app:itemTextColor是设置底部导航按钮文字颜色的属性 由于大多情况下图标和文件颜色都是相同的(为了统一风格样式),所以它们两个我用的是同一个颜色选择器 说到这BottomNaviationView这个控件就说完了,下面解释一下activity_main.xml文件中的状态栏控件,在布局中写状态栏的原因是因为我们的应用主题是没有ActionBar并且状态栏是透明的,所以状态栏和标题栏需要我们自己来写(也是为了满足用户定义不同样式的 阅读详情

相关推荐

安卓BottomNavigationView页面切换

我们通过反射拿到了BottomNavigationMenuView,至于为什么是BottomNavigationView 的第一个子View这就要看源码了,AS中直接可以点进去看。Android端采用底部导航栏的APP非常多,比如微信、微博、支付宝...等等,这也不能说是盲目学习iOS,毕竟好东西大家都可以用,各家操作系统也都在博采众长,互相学习。没办法了,查了一圈资料,发现官方这个控件还不支持代码层级的切换选项(如果你发现了,请告诉我)。细心的朋友可能发现了,上面的代码为什么用了反射呢?

buxiangzilv的博客 926

BottomNavigationView--基本使用总结

1、BottomNavigationView 是什么? BottomNavigationView 是安卓官方提供的底部导航栏,能够方便的实现下图中的底部导航效果。 Paste_Image.png 按照 官方的设计规范 https://material.io/guidelines/components/bottom-navigation.html# 当底部导航的标签在 3--5 个之间的时...

lwh156541064的博客 6689

BottomNavigationView+ViewPager+Fragment+TabLayout 常见设计问题解决

2019.10.31更新: 禁止viewpager滑动的办法。项目中的那个有点问题。 package com.vwiov.enterpriseapp.widget; import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; impor...

Android菜鸟成长记 6595

Android关于BottomNavigationView使用指南

BottomNavigationView

QG 5819

Android进阶之路 - BottomNavigationView的使用与问题处理方案

底部导航的实现之一为BottomNavigationView,乃是design库下的一款控件,或为Android 5.0的一种,同时根据某篇博文介绍说sdk25以后才可以使用,最好相对高于25.1,因为有一些问题没有处理好。 闲话不多唠,此篇文章是根据多篇博文,进行总结性的一篇记录,其中的知识点都已经手动敲打过一次,请继续前行!

Android、前端、小程序、后端 3万+

M系列芯片MacBook上UTM虚拟机部署达梦DM8的避坑指南

本文详细介绍了在M系列芯片MacBook上使用UTM虚拟机部署达梦数据库DM8的完整流程与避坑指南。针对ARM架构环境,重点解决了虚拟机选择、麒麟系统安装、系统调优及DM8命令行安装中的常见问题,为开发者提供了稳定可靠的国产数据库本地测试方案。

weixin_28455801的博客 451

Android 底部导航栏(一、BottomNavigationView+Menu+Fragment)

现在常用的App主页都会有一个底部导航栏,根据需求也使用过好几种方法进行实现,于是想着还是总结一下,今天还写一个简单的BottomNavigationView方法来实现这个功能它是android原生的一个底部导航框架,一般和Fragment一起使用。xml布局:最外层的layout不用管,那是databinding框架的根布局,主要的布局FrameLayout来装载fragment列表,BottomNavigationView实现底部导航栏,最后监听绑定实现点击切换 其中BottomNavigation

Android 领域开发程序员,希望通过写博客的方式不断的总结提升自己,大家共同进步哦! 1万+

AD620仪表放大器模块实战:从双电源切换到单电源供电的完整指南(附原理图)

本文深入探讨了AD620仪表放大器模块从双电源切换到单电源供电的常见陷阱与正确方案。通过解析AD620的内部架构与电气特性,指出其“天生”依赖双电源,简单的跳线改装会导致芯片损坏或失效。文章提供了基于AD623芯片的真正单电源替代方案,并附有原理图与实战波形对比,为便携式设备设计提供了完整指南。

weixin_29231027的博客 365

BottomNavigationView结合ViewPager搭建流行UI框架,android开发基础试题

android:id="@+id/tab_two" android:icon="@drawable/tab_two_selector" android:title="@string/tab_two"/> <item android:id="@+id/tab_three" android:icon="@dra wable/tab_three_selector" android:title="@string/tab_three"/> 我们看到里面总共有三个导航按钮,我们以第一个为例做一下简单

m0_66264588的博客 246

保姆级教程:在Ubuntu 22.04上用VLLM+OpenWebUI部署DeepSeek-R1-14B(含Q8量化模型下载)

本文提供在Ubuntu 22.04上使用VLLM和OpenWebUI部署DeepSeek-R1-14B大语言模型的完整教程,包括环境配置、模型下载、VLLM参数调优及OpenWebUI集成。特别针对Q8量化模型优化部署流程,解决CUDA版本冲突等常见问题,适合开发者快速搭建本地AI对话系统。

weixin_26712075的博客 430

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

因为这份文档我是边做边写的,遇到问题重新装了好几次所以IP会很乱ESXI主机为192.168.20.10VCSA为192.168.20.7,后台为192.168.20.7:5480后期请自行对应,后面的192.168.20.57请对应192.168.20.7,或根据自己的来。

m0_70212665的博客 5710

BottomNavigationView+ViewPager+Fragment 底部导航按钮

博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主威威喵原创,请多支持与指教。 本文首发于此 博主:威威喵|博客主页:https://blog.youkuaiyun.com/smile_running 感受 Material Design UI 魅力,你不能错过的Material Design 全系列文章: Material Design 之一 Bott...

你若盛开,蜜蜂自来 2万+

用Python实现图片风格迁移,让你的图片更加的高逼格!

先来看下效果: 上图是老王在甘南合作的米拉日巴佛阁外面拍下的一张照片,采用风格迁移技术后的效果为: 一些其它效果图: 下面进入正题。 近年来,由深度学习所引领的人工智能(AI)技术浪潮,开始越来越广泛地应用到生活各个领域。这其中,人工智能与艺术的交叉碰撞,在相关技术领域和艺术领域引起了高度关注。就在上个月,由电脑生成的艺术品在佳士得(Christie’s)的拍卖价竟高达43.25万美元,...

Python追梦 6180

Android流行UI布局——底部导航(BottomNavigationView+ViewPager+Fragment)

这篇文章为大家带来 1.官方BottomNavigationView的使用方法 2.结合ViewPager、Fragment实现一个流行UI布局! 3.并用反射解决ViewPager与BottomNavigationView侧滑联动时的一个小问题。 最终实现效果:在谷歌官方发布BottomNavigationView控件之前我们可以自己组合控件实现,比如LinearLayout +

Chigo 937

基于Simulink的永磁同步电机容错控制(缺相容错)

本文基于Simulink平台,详细介绍了永磁同步电机(PMSM)缺相容错控制的仿真实现方法。针对逆变器开路故障导致的缺相问题,提出"检测-重构-补偿"三阶段控制策略:采用电流阈值法快速检测故障(<5ms),重构αβ坐标系实现两相矢量控制,并通过谐波电流注入抑制转矩脉动(<8%)。仿真结果表明,该方法能有效维持故障后电机运行,转速波动<3%,满足电动汽车等关键应用的可靠性需求。文章包含完整的Simulink建模步骤、MATLAB函数代码及参数设置,为工程实践提供了可复现的

xiaoheshang_123的博客 146

Qt6.10 | Qt Bluetooth 蓝牙

本文介绍了QtBluetooth模块的功能和使用方法,包括蓝牙API概述、构建配置(CMake/qmake)、权限管理、平台支持(Linux/macOS特殊处理)、日志设置及许可信息。重点说明Linux平台的后端选择机制,以及macOS上的依赖限制。最后提及蓝牙聊天示例,展示RFCOMM协议通信的实现。全文提供了蓝牙开发的技术要点和注意事项。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 399

android 流行布局,Android流行UI布局——底部导航(BottomNavigationView+ViewPager+Fragment)...

前言:Android端采用底部导航栏的APP非常多,比如微信、微博、支付宝...等等,这也不能说是盲目学习iOS,毕竟好东西大家都可以用,各家操作系统也都在博采众长,互相学习。Android端的底部导航栏有着一套规范,详情。这篇文章为大家带来1.官方BottomNavigationView的使用方法2.结合ViewPager、Fragment实现一个流行UI布局!3.并用反射解决ViewPager...

weixin_30555169的博客 560

【二.图像处理核心技术】【5.形态学操作:腐蚀/膨胀/开闭运算】

想象一下,你拍了一张布满雪花点的老照片,或者扫描了字迹断裂的文档,这时候形态学操作就是你的像素整形师!它们能让模糊的边界变清晰,把断裂的笔画连起来,甚至从X光片里揪出癌细胞。今天我们要聊的,是计算机视觉界的"广场舞双雄"——腐蚀和膨胀。这俩操作就像给像素点们请了个健身教练,要么集体减肥(腐蚀),要么组团增肌(膨胀)。下次当你用美颜相机时,不妨会心一笑——这看似魔法的背后,正是形态学在默默耕耘。腐蚀的规则很简单:如果一个像素点周围的邻居不全白,它就"狗带"(变黑)。:先用砂纸打磨(腐蚀),再喷漆填补(膨胀)

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 425

Android ViewPager2 + Fragment + BottomNavigationView 联动

Android ViewPager2 + Fragment + BottomNavigationView 联动 本篇主要介绍一下 ViewPager2 + Fragment + BottomNavigationView , 上篇中把ViewPager2和Fragment 联动起来了, 本篇主要把 BottomNavigationView集成进去 概述 BottomNavigationView 是一个底部导航控件, 现在要实现的效果就是 滑动ViewPager2 中的Fragment 并且底部Bot

qq_34285557的博客 2714

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android BottomNavigationView + ViewPager 用法

MainActivity private List<Fragment> fragmentList; private void initBottom() { fragmentList = new ArrayList<>(); fragmentList.add(new HomeFragment()); fragmen...

张雨的博客 1686

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: Android应用打开另一个应用程序(只需要包名)
下一篇: google vr 入门之制作简易的VR播放器(二)
github_2011
博客等级 码龄10年 116粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值