![【移动应用开发技术】如何在Android中使用BottomNavigationBar实现底部导航_第1页](http://file4.renrendoc.com/view/2b06c3036915a1d2d58151f3b7120e7b/2b06c3036915a1d2d58151f3b7120e7b1.gif)
![【移动应用开发技术】如何在Android中使用BottomNavigationBar实现底部导航_第2页](http://file4.renrendoc.com/view/2b06c3036915a1d2d58151f3b7120e7b/2b06c3036915a1d2d58151f3b7120e7b2.gif)
![【移动应用开发技术】如何在Android中使用BottomNavigationBar实现底部导航_第3页](http://file4.renrendoc.com/view/2b06c3036915a1d2d58151f3b7120e7b/2b06c3036915a1d2d58151f3b7120e7b3.gif)
![【移动应用开发技术】如何在Android中使用BottomNavigationBar实现底部导航_第4页](http://file4.renrendoc.com/view/2b06c3036915a1d2d58151f3b7120e7b/2b06c3036915a1d2d58151f3b7120e7b4.gif)
![【移动应用开发技术】如何在Android中使用BottomNavigationBar实现底部导航_第5页](http://file4.renrendoc.com/view/2b06c3036915a1d2d58151f3b7120e7b/2b06c3036915a1d2d58151f3b7120e7b5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】如何在Android中使用BottomNavigationBar实现底部导航
这期内容当中在下将会给大家带来有关如何在Android中使用BottomNavigationBar实现底部导航,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。补充布局文件activity_main<?xml
version="1.0"
encoding="utf-8"?>
<LinearLayout
xmlns:android="/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical">
<FrameLayout
android:id="@+id/tb"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#eeeeee"
/>
<com.ashokvarma.bottomnavigation.BottomNavigationBar
android:id="@+id/bottom_navigation_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
/>
</LinearLayout>1、默认使用studio背景图,防止少图片资源(效果图虽不尽人意~)<imgalt=""src="/file_images/article/201911/2019113134446598.jpg/>2、项目build.gradle添加依赖:(注意studio3.0以下将implementation换成compile)implementation
'com.ashokvarma.android:bottom-navigation-bar:2.0.4'3、MainActivityimport
android.graphics.Color;
import
android.support.v4.app.FragmentManager;
import
android.support.v4.app.FragmentTransaction;
import
android.support.v7.app.AppCompatActivity;
import
android.os.Bundle;
import
android.util.TypedValue;
import
android.view.Gravity;
import
android.view.View;
import
android.view.ViewGroup;
import
android.widget.FrameLayout;
import
android.widget.ImageView;
import
android.widget.LinearLayout;
import
android.widget.TextView;
import
com.ashokvarma.bottomnavigation.BottomNavigationBar;
import
com.ashokvarma.bottomnavigation.BottomNavigationItem;
import
com.ashokvarma.bottomnavigation.ShapeBadgeItem;
import
com.ashokvarma.bottomnavigation.TextBadgeItem;
import
java.lang.reflect.Field;
public
class
MainActivity
extends
AppCompatActivity
implements
BottomNavigationBar.OnTabSelectedListener
{
private
FragmentManager
mFragmentManager;
private
BottomNavigationBar
bottomNavigationBar;
private
FirstFragment
firstFragment;
private
SecondFragment
secondFragment;
private
ThirdFragment
thirdFragment;
private
FourthFragment
fourthFragment;
//默认选择第一个fragment
private
int
lastSelectedPosition
=
0;
private
FragmentTransaction
transaction;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bottomNavigationBar
=
this.findViewById(R.id.bottomNavigationBar);
showNumberAndShape();
initNavigation();
}
/**
*
初始底部导航栏
*/
private
void
initNavigation()
{
//导航栏Item的个数<=3
用
MODE_FIXED
模式,否则用
MODE_SHIFTING
模式
bottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);
bottomNavigationBar.setTabSelectedListener(this);//监听切换点击事件
//bottomNavigationBar.setBarBackgroundColor("#595757");//背景颜色
//1、BACKGROUND_STYLE_DEFAULT:如果设置的Mode为MODE_FIXED,将使用BACKGROUND_STYLE_STATIC
。如果Mode为MODE_SHIFTING将使用BACKGROUND_STYLE_RIPPLE。
//2、BACKGROUND_STYLE_STATIC:点击无水波纹效果
//3、BACKGROUND_STYLE_RIPPLE:点击有水波纹效果
bottomNavigationBar.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC);
//需要添加的item数
bottomNavigationBar
//选中时的图片的资源、文字
.addItem(new
BottomNavigationItem(R.drawable.home,
"首页")
//选中的颜色
.setActiveColor(R.color.colorAccent)
//选中的颜色(资源文件
下面同上)
//.setActiveColorResource(R.color.colorAccent)
//未选中的颜色(默认灰色
可注释)
.setInActiveColor("#999999")
//未选中时的图片的资源
.setInactiveIconResource(R.drawable.ic_launcher_background))
.addItem(new
BottomNavigationItem(R.drawable.home,
"订单")
.setActiveColorResource(R.color.colorAccent)
.setInActiveColor("#999999")
.setInactiveIconResource(R.drawable.ic_launcher_background)).
addItem(new
BottomNavigationItem(R.drawable.ic_launcher_background,
"购物车")
.setActiveColorResource(R.color.colorAccent)
.setInActiveColor("#999999")
.setBadgeItem(textBadgeItem)
.setInactiveIconResource(R.drawable.ic_launcher_background)).
addItem(new
BottomNavigationItem(R.drawable.ic_launcher_background,
"我的")
.setActiveColorResource(R.color.colorAccent)
.setInActiveColor("#999999")
.setBadgeItem(shapeBadgeItem)
.setInactiveIconResource(R.drawable.ic_launcher_background))
.setFirstSelectedPosition(lastSelectedPosition)//设置默认选中项
//.setFab(FloatingActionButton的id)//FloatingActionButton
关联
.initialise();//注意此句放在最后
setIconItemMargin(bottomNavigationBar,10,25,14);
setDefaultFragment();
}
/**
*
设置默认开启的fragment
*/
private
void
setDefaultFragment()
{
mFragmentManager
=
getSupportFragmentManager();
FragmentTransaction
transaction
=
mFragmentManager.beginTransaction();
firstFragment
=
new
FirstFragment();
transaction.add(R.id.tb,
firstFragment);
mit();
}
/**
*
切换事件
*/
@Override
public
void
onTabSelected(int
position)
{
lastSelectedPosition
=
position;//每次点击赋值
//开启事务
transaction
=
mFragmentManager.beginTransaction();
hideFragment(transaction);
switch
(position)
{
case
0:
if
(firstFragment
==
null)
{
firstFragment
=
new
FirstFragment();
transaction.add(R.id.tb,
firstFragment);
}
else
{
transaction.show(firstFragment);
}
//
transaction.replace(R.id.tb,
firstFragment);
break;
case
1:
if
(secondFragment
==
null)
{
secondFragment
=
new
SecondFragment();
transaction.add(R.id.tb,
secondFragment);
}
else
{
transaction.show(secondFragment);
}
break;
case
2:
if
(thirdFragment
==
null)
{
thirdFragment
=
new
ThirdFragment();
transaction.add(R.id.tb,
thirdFragment);
}
else
{
transaction.show(thirdFragment);
}
break;
case
3:
if
(fourthFragment
==
null)
{
fourthFragment
=
new
FourthFragment();
transaction.add(R.id.tb,
fourthFragment);
}
else
{
transaction.show(fourthFragment);
}
break;
}
//
事务提交
mit();
}
/**
*
隐藏当前fragment
*
*
@param
transaction
*/
private
void
hideFragment(FragmentTransaction
transaction)
{
if
(firstFragment
!=
null)
{
transaction.hide(firstFragment);
}
if
(secondFragment
!=
null)
{
transaction.hide(secondFragment);
}
if
(thirdFragment
!=
null)
{
transaction.hide(thirdFragment);
}
if
(fourthFragment
!=
null)
{
transaction.hide(fourthFragment);
}
}
private
TextBadgeItem
textBadgeItem;
private
ShapeBadgeItem
shapeBadgeItem;
/**
*
展示消息点
*/
private
void
showNumberAndShape()
{
//消息
textBadgeItem
=
new
TextBadgeItem()
.setText("99")//显示的文本
.setTextColor("#ffffff")//文本颜色
//.setTextColorResource(R.color.colorAccent)//文本颜色(资源文件-下面如同)
.setBorderWidth(6)//圆环宽度
.setBorderColor(Color.parseColor("#000000"))//圆环燕色
//.setBorderColorResource(R.color.colorPrimary)
.setBackgroundColor("#FF4081")//背景颜色
.setHideOnSelect(false);//选中是否隐藏
//.setBackgroundColorResource(R.color.colorAccent)//背景颜色
//.setAnimationDuration(300)//隐藏与动画的过渡时间(setHideOnSelect
为true时生效)
//.setGravity(Gravity.RIGHT
|
Gravity.TOP);
//位置,默认右上角(可不设置)
//形状
shapeBadgeItem
=
new
ShapeBadgeItem()
//也可设置为常量
(0-6之间)
.setShape(ShapeBadgeItem.SHAPE_HEART)
//形状
.setShapeColor(Color.RED)
//颜色
//.setShapeColorResource(R.color.colorPrimaryDark)
//(同上)
.setEdgeMarginInDp(this,
0)
//距离Item的边距,dp值
//.setEdgeMarginInPixels(20)
//距离Item的边距,px
.setSizeInDp(this,
15,
15)
//宽高值,dp
//.setSizeInPixels(30,
30)
//宽高值,px
.setAnimationDuration(300)
//隐藏和展示的动画速度,单位毫秒,和setHideOnSelect一起使用
//.setGravity(Gravity.LEFT)
//位置,默认右上角
.setHideOnSelect(false);
//true:当选中状态时消失,非选中状态显示,moren
false
}
@Override
public
void
onTabUnselected(int
position)
{
}
@Override
public
void
onTabReselected(int
position)
{
}
/**
*
修改间距及图片文字大小
*
@param
bottomNavigationBar
*
@param
space
文字与图片的间距
*
@param
imgLen
单位:dp,图片大小
*
@param
textSize
单位:dp,文字大小
*/
private
void
setIconItemMargin(BottomNavigationBar
bottomNavigationBar,
int
space,
int
imgLen,
int
textSize){
Class
barClass
=
bottomNavigationBar.getClass();
Field[]
fields
=
barClass.getDeclaredFields();
for(int
i
=
0;
i
<
fields.length;
i++){
Field
field
=
fields[i];
field.setAccessible(true);
if(field.getName().equals("mTabContainer")){
try{
//反射得到
mTabContainer
LinearLayout
mTabContainer
=
(LinearLayout)
field.get(bottomNavigationBar);
for(int
j
=
0;
j
<
mTabContainer.getChildCount();
j++){
//获取到容器内的各个Tab
View
view
=
mTabContainer.getChildAt(j);
//获取到Tab内的各个显示控件
FrameLayout.LayoutParams
params
=
new
FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
dip2px(56));
FrameLayout
container
=
(FrameLayout)
view.findViewById(R.id.fixed_bottom_navigation_container);
container.setLayoutParams(params);
container.setPadding(dip2px(12),
dip2px(0),
dip2px(12),
dip2px(0));
//获取到Tab内的文字控件
TextView
labelView
=
(TextView)
view.findViewById(com.ashokvarma.bottomnavigation.R.id.fixed_bottom_navigation_title);
//计算文字的高度DP值并设置,setTextSize为设置文字正方形的对角线长度,所以:文字高度(总内容高度减去间距和图片高度)*根号2即为对角线长度,此处用DP值,设置该值即可。
labelView.setTextSize(TypedValue.COMPLEX_UNIT_DIP,
textSize);
labelView.setIncludeFontPadding(false);
labelView.setPadding(0,0,0,dip2px(20-textSize
-
space/2));
//获取到Tab内的图像控件
ImageView
iconView
=
(ImageView)
view.findViewById(com.ashokvarma.bottomnavigation.R.id.fixed_bottom_navigation_icon);
//设置图片参数,其中,MethodUtils.dip2px():换算dp值
params
=
new
FrameLayout.LayoutParams(dip2px(imgLen),
dip2px(imgLen));
params.setMargins(0,0,0,space/2);
params.gravity
=
Gravity.BOTTOM
|
Gravity.CENTER_HORIZONTAL;
iconView.setLayoutParams(params);
}
}
catch
(IllegalAccessException
e){
e.printStackTrace();
}
}
}
}
private
int
dip2px(float
dpValue)
{
final
float
scale
=
getApplication().getResources().getDisplayMetrics().density;
return
(int)
(dpValue
*
scale
+
0.5f);
}
}其中有4个碎片在这只贴出FirstFragment(其余几乎一致)4、FirstFragmentimport
android.os.Bundle;
import
android.support.annotation.NonNull;
import
android.support.v4.app.Fragment;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.ViewGroup;
public
class
FirstFragment
extends
Fragment
{
@Override
public
View
onCreateView(@NonNull
LayoutInflater
inflater,
V
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年代保管档案协议(2篇)
- 2025年企业单位雇佣合同模板(2篇)
- 2025年买卖合作廉洁协议经典版(2篇)
- 2025年交通事故自行协商协议(三篇)
- 2025年个人汽车贷款担保合同简单版(2篇)
- 地铁项目居间合同协议书
- 八年级大考数学试卷
- 幼儿园全包装修合同条款
- 沙石运输诚信体系建设合同
- 乐器运输协调协议
- 动火作业安全管理要求及控制措施
- 诗豪刘禹锡一生部编教材PPT
- 资源循环科学和工程专业建设探讨
- 中国营养师培训教材1
- 2023年河南省郑州市一模道德与法治试题(含答案)
- 《民航服务沟通技巧》教案第13课内部沟通基础知识
- 2023年湖南高速铁路职业技术学院高职单招(语文)试题库含答案解析
- FZ/T 54024-2019锦纶6预取向丝
- 2022年云南省中考数学试卷及答案
- 30453自考机电一体化技术及应用小抄
- 水利生产安全事故典型案例分析
评论
0/150
提交评论