1. 实现底部的Tab,自定义TabContainerView 继承 RelativeLayout,这是我们最终封装的View工具类。其内部主要由viewpager和底部的TabHost类组成。

ViewPager初始化contentViewPager = new ViewPager(context);

LayoutParams contentVpLp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

contentVpLp.addRule(RelativeLayout.ABOVE, R.id.divide_tab);

contentViewPager.setLayoutParams(contentVpLp);

contentViewPager.setId(R.id.viewpager_tab);

contentViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {            @Override

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

}

·            @Override

public void onPageSelected(int position) {

tabHost.onChangeTabHostStatus(position);

Tab selectedTab = tabHost.getTabForIndex(position);                if (onTabSelectedListener != null && selectedTab != null) onTabSelectedListener.onTabSelected(selectedTab);

}

@Override

public void onPageScrollStateChanged(int state) {

}

});

addView(contentViewPager);底部Tab是一个自定义的横向布局LinearLayout,动态添加多个宽度等分的Tab按钮for (int i = 0; i

if((i+1)==hasMsgIndex){

hasMsg=true;

}

Tab tab = new Tab(context, textArray[i], textSize, textColor, selectedTextColor,drawablePadding,iconWidth,iconHeight, iconImageArray[i], selectedIconImageArray[i], i,hasMsg);

addTab(tab);}tab按钮的实现rootView = new LinearLayout(context);

childView=new RelativeLayout(context);

LinearLayout.LayoutParams rootViewLp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

rootViewLp.weight = 1;

rootView.setOrientation(LinearLayout.VERTICAL);

rootView.setPadding(0,20,0,20);

rootView.setLayoutParams(rootViewLp);

textTextView = new TextView(context);

iconImageView = new ImageView(context);

/**

*  icon view

*/

iconImageView.setImageResource(iconImage);

RelativeLayout.LayoutParams iconParam=new RelativeLayout.LayoutParams(iconWidth==0? ViewGroup.LayoutParams.WRAP_CONTENT:iconWidth,iconHeight==0? ViewGroup.LayoutParams.WRAP_CONTENT:iconHeight);

iconParam.addRule(RelativeLayout.CENTER_HORIZONTAL);

iconImageView.setLayoutParams(iconParam);

iconImageView.setId(index+1);

childView.addView(iconImageView);

/**

*  text view

*/

textTextView.setText(text);

textTextView.setTextColor(textColor);

textTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX,textSize);

textTextView.setPadding(0,drawablePadding,0,0);

RelativeLayout.LayoutParams txParam=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

txParam.addRule(RelativeLayout.BELOW,childView.getChildAt(0).getId());

txParam.addRule(RelativeLayout.CENTER_HORIZONTAL);

textTextView.setLayoutParams(txParam);

childView.addView(textTextView);

if(hasMsg){

ImageView circleView=new ImageView(context);

RelativeLayout.LayoutParams param = new RelativeLayout.LayoutParams(30,30);

param.addRule(RelativeLayout.RIGHT_OF,iconImageView.getId());

circleView.setBackgroundResource(R.drawable.common_red_round);

circleView.setLayoutParams(param);

childView.addView(circleView);

}

RelativeLayout.LayoutParams childParam=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

childView.setLayoutParams(childParam);

rootView.addView(childView);

三、使用方法

布局中引用

android:id="@+id/tab_container"

android:layout_width="match_parent"

android:layout_height="match_parent"

app:tabTextColor="@color/bottom_icon_up"

app:selectedTextColor="@color/common_red"

app:tabTextSize="12sp"

app:drawablePadding="1dp"

app:iconHeight="22dp"

app:iconWidth="22dp"

app:divideLineColor="@color/common_line_two"

app:divideLineHeight="0.3dp"/>ACTIVITY中引用TabContainerView tabContainerView = (TabContainerView) findViewById(R.id.tab_container);

MainViewAdapter mainViewAdapter=new MainViewAdapter(getSupportFragmentManager(),

new Fragment[] {new TabFragment1(), new TabFragment2(),new TabFragment3(), new TabFragment4(),new TabFragment5()});

mainViewAdapter.setHasMsgIndex(5);

tabContainerView.setAdapter(mainViewAdapter);

tabContainerView.setOnTabSelectedListener(new OnTabSelectedListener() {

@Override

public void onTabSelected(Tab tab) {

}

});布局自定义属性介绍tabTextSize:导航按钮字体大小

drawablePadding:导航图片与文字的间距

iconHeight: 导航图标高度

iconWidth:导航图标宽度

divideLineColor:导航栏顶部分割线颜色

divideLineHeight:导航栏顶部分割线高度设置消息提醒(导航按钮旁边的红点)setHasMsgIndex(5); //第五个导航按钮有消息提醒demo地址:

https://github.com/Louis2014/TabView

打开App,阅读手记

android底部导航栏下沉,【详细】手把手教你快速实现Android底部导航栏相关推荐

  1. ESP8266 Non-OS SDK 开发之旅 基础篇① 初识 Non-OS SDK,史上超级详细手把手教小白20分钟快速搭建SDK软件开发环境,完成第一个例子Hello World!

    文章目录 1.前言 2. SDK概述 2.1 SDK使用流程 2.2 ESP8266 HDK -- 硬件开发工具 2.3 ESP8266 SDK -- 软件开发工具包 2.3.1 Non-OS SDK ...

  2. 【嵌入式Android开发学习攻略】手把手教你循序渐进的学习

    [嵌入式Android开发学习攻略]手把手教你循序渐进的学习 学习嵌入式主要有以下几个方面: C语言:C是必须学的,它是最基础的 操作系统:Linux.Android   目前Linux是主流,这个一 ...

  3. 导航上显示某个地点已关闭什么意思_朋友手机发送的位置,怎么分享到车载大屏导航,老司机手把手教你...

    导读:朋友手机发送的位置,怎么分享到车载大屏导航,老司机手把手教你 各位点开这篇文章的朋友们,想必都是很高的颜值吧,我们真的是很有缘哦,小编每天都会给大家带来不一样的汽车资讯,如果对小编的文章或者其他 ...

  4. 微信小程序手把手教你实现类似Android中ViewPager控件效果

    微信小程序手把手教你实现类似Android中ViewPager控件效果 前言 需求分析 头部TAB 滑动的内容部分 最终版本 尾巴 前言 在做Android开发的时候,ViewPager是开发者使用频 ...

  5. 超详细——手把手教你用threejs实现一个酷炫的模型发光扫描效果(三)

    上一篇文章 voidjay,公众号:web前端可视化超详细--手把手教你用threejs实现一个酷炫的模型发光扫描效果(二) 上一篇文章已完成基本效果的实现,本文则完成整个项目的灵魂:发光效果以及模型 ...

  6. 《从零构建前后分离的web项目》:前端完善 - 手把手教你快速构建网站布局

    添砖加瓦 - 手把手教你快速构建网站布局 项目地址 本章源码地址 文章地址 本文为方便讲述重构去除了 Element.vux 库,用了最近比较火的 bulma 轻量.快捷.易读. 项目截屏 Layou ...

  7. 手把手教你快速入门知识图谱 - Neo4J教程

    手把手教你快速入门知识图谱 - Neo4J教程 前言 1. Neo4J简介 2. Neo4J安装 3. Neo4J使用 4. Cypher查询语言 5. Neo4J实战教程 1. 首先,我们删除数据库 ...

  8. 手把手教你快速搭建私服环境

    手把手教你快速搭建私服环境,简单实用,一看就懂 1.准备工作:先下载Nxus Nexus 是 Maven 仓库管理器, 通过 nexus 可以搭建 maven 仓库,同时 nexus 还提供强大的仓库 ...

  9. 测试手机新机软件,玩机小技巧 篇一:手把手教你快速验新机——写给剁手节买了新手机的值友...

    玩机小技巧 篇一:手把手教你快速验新机--写给剁手节买了新手机的值友 2020-12-10 17:39:14 29点赞 97收藏 11评论 创作立场声明:本文旨在分享购入新机器后如何检验手机完好的小技 ...

最新文章

  1. Linux一键安装PHP/JAVA环境OneinStack
  2. 用一个例子告诉你gdb调试工具如何使用
  3. boost::filesystem::path::stem的用法测试程序
  4. java中四种线程池及poolSize、corePoolSize、maximumPoolSize
  5. 大规模部署桌面虚拟化时的问题
  6. python开发公司网站_用python开发网站
  7. 通过Lotusscript修改数据库主模板属性
  8. Tensorflow 实战 Google 深度学习框架(第2版)---- 10.2.2节 P272 代码
  9. 装饰模式案列(OutputStream)
  10. 【推荐系统】音乐推荐系统02
  11. 下载yaml appium
  12. 1-10000内的素数c语言,输入1-10000的素数
  13. Ubuntu笔记本设置WiFi热点
  14. 如何下载网站的在线视频
  15. 2055013-55-1,Ald-Ph-PEG6-acid在EDC或HATU等活化剂存在下,末端羧酸可与伯胺偶联形成稳定的酰胺键
  16. 产品手记专注0基础转行产品经理平台
  17. 哈夫曼树及哈夫曼编码(考试常考版)
  18. gdc服务器硬盘修复,GDC硬盘检测、阵列新建和修复.pptx
  19. 数加生产制造执行系统(MES)——优势
  20. 在计算机领域中英文单词byte表示,1在计算机领域中通常用英文单词byte来表示.doc...

热门文章

  1. PIC单片机精通_串口通信模块C实现
  2. 一键清除Delphi中无用的文件
  3. 程序设计原则——优化程序
  4. setup.s 总结——Linux-0.11 剖析笔记(四)
  5. 【C/C++多线程编程之三】创建pthread线程
  6. JVM_01 总体概述
  7. Python实例 -- .git格式转为.png格式
  8. 从思维导图学习操作系统(二)
  9. Ubuntu 14 配置Android Studio的快捷启动方式
  10. 如何优化 Android Studio 启动、编译和运行速度?