Android BottomNavigationBar底部導(dǎo)航的使用方法
簡(jiǎn)介:Google推出的BottomNavigationBar底部導(dǎo)航欄
1 、基本的使用(add和replace方式)
2、擴(kuò)展添加消息和圖形
3、修改圖片大小與文字間距
版本更新:2019-5-13
補(bǔ)充布局文件activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/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、默認(rèn)使用studio背景圖,防止少圖片資源(效果圖雖不盡人意~)
2、項(xiàng)目build.gradle添加依賴:(注意studio3.0以下將implementation 換成 compile)
implementation 'com.ashokvarma.android:bottom-navigation-bar:2.0.4'
3、MainActivity
import 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;
//默認(rèn)選擇第一個(gè)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();
}
/**
* 初始底部導(dǎo)航欄
*/
private void initNavigation() {
//導(dǎo)航欄Item的個(gè)數(shù)<=3 用 MODE_FIXED 模式,否則用 MODE_SHIFTING 模式
bottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);
bottomNavigationBar.setTabSelectedListener(this);//監(jiān)聽(tīng)切換點(diǎn)擊事件
//bottomNavigationBar.setBarBackgroundColor("#595757");//背景顏色
//1、BACKGROUND_STYLE_DEFAULT:如果設(shè)置的Mode為MODE_FIXED,將使用BACKGROUND_STYLE_STATIC 。如果Mode為MODE_SHIFTING將使用BACKGROUND_STYLE_RIPPLE。
//2、BACKGROUND_STYLE_STATIC:點(diǎn)擊無(wú)水波紋效果
//3、BACKGROUND_STYLE_RIPPLE:點(diǎn)擊有水波紋效果
bottomNavigationBar.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC);
//需要添加的item數(shù)
bottomNavigationBar
//選中時(shí)的圖片的資源、文字
.addItem(new BottomNavigationItem(R.drawable.home, "首頁(yè)")
//選中的顏色
.setActiveColor(R.color.colorAccent)
//選中的顏色(資源文件 下面同上)
//.setActiveColorResource(R.color.colorAccent)
//未選中的顏色(默認(rèn)灰色 可注釋)
.setInActiveColor("#999999")
//未選中時(shí)的圖片的資源
.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, "購(gòu)物車")
.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)//設(shè)置默認(rèn)選中項(xiàng)
//.setFab(FloatingActionButton的id)//FloatingActionButton 關(guān)聯(lián)
.initialise();//注意此句放在最后
setIconItemMargin(bottomNavigationBar,10,25,14);
setDefaultFragment();
}
/**
* 設(shè)置默認(rèn)開(kāi)啟的fragment
*/
private void setDefaultFragment() {
mFragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = mFragmentManager.beginTransaction();
firstFragment = new FirstFragment();
transaction.add(R.id.tb, firstFragment);
transaction.commit();
}
/**
* 切換事件
*/
@Override
public void onTabSelected(int position) {
lastSelectedPosition = position;//每次點(diǎn)擊賦值
//開(kāi)啟事務(wù)
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;
}
// 事務(wù)提交
transaction.commit();
}
/**
* 隱藏當(dāng)前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;
/**
* 展示消息點(diǎn)
*/
private void showNumberAndShape() {
//消息
textBadgeItem = new TextBadgeItem()
.setText("99")//顯示的文本
.setTextColor("#ffffff")//文本顏色
//.setTextColorResource(R.color.colorAccent)//文本顏色(資源文件-下面如同)
.setBorderWidth(6)//圓環(huán)寬度
.setBorderColor(Color.parseColor("#000000"))//圓環(huán)燕色
//.setBorderColorResource(R.color.colorPrimary)
.setBackgroundColor("#FF4081")//背景顏色
.setHideOnSelect(false);//選中是否隱藏
//.setBackgroundColorResource(R.color.colorAccent)//背景顏色
//.setAnimationDuration(300)//隱藏與動(dòng)畫的過(guò)渡時(shí)間(setHideOnSelect 為true時(shí)生效)
//.setGravity(Gravity.RIGHT | Gravity.TOP); //位置,默認(rèn)右上角(可不設(shè)置)
//形狀
shapeBadgeItem = new ShapeBadgeItem()
//也可設(shè)置為常量 (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) //隱藏和展示的動(dòng)畫速度,單位毫秒,和setHideOnSelect一起使用
//.setGravity(Gravity.LEFT) //位置,默認(rèn)右上角
.setHideOnSelect(false); //true:當(dāng)選中狀態(tài)時(shí)消失,非選中狀態(tài)顯示,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++){
//獲取到容器內(nèi)的各個(gè)Tab
View view = mTabContainer.getChildAt(j);
//獲取到Tab內(nèi)的各個(gè)顯示控件
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內(nèi)的文字控件
TextView labelView = (TextView) view.findViewById(com.ashokvarma.bottomnavigation.R.id.fixed_bottom_navigation_title);
//計(jì)算文字的高度DP值并設(shè)置,setTextSize為設(shè)置文字正方形的對(duì)角線長(zhǎng)度,所以:文字高度(總內(nèi)容高度減去間距和圖片高度)*根號(hào)2即為對(duì)角線長(zhǎng)度,此處用DP值,設(shè)置該值即可。
labelView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, textSize);
labelView.setIncludeFontPadding(false);
labelView.setPadding(0,0,0,dip2px(20-textSize - space/2));
//獲取到Tab內(nèi)的圖像控件
ImageView iconView = (ImageView) view.findViewById(com.ashokvarma.bottomnavigation.R.id.fixed_bottom_navigation_icon);
//設(shè)置圖片參數(shù),其中,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個(gè)碎片在這只貼出FirstFragment (其余幾乎一致)
4、FirstFragment
import 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, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_first_fragment, container, false);
return view;
}
}
注意引用V4的包
其布局:activity_first_fragment
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第一個(gè)Fragment"
android:textSize="30sp" />
</LinearLayout>
5、若要使用replace的顯示方式,將onTabSelected監(jiān)聽(tīng)處改為如下代碼即可
1)、switch處
switch (position) {
case 0:
firstFragment = new FirstFragment();
transaction.replace(R.id.tb, firstFragment);
break;
case 1:
secondFragment = new SecondFragment();
transaction.replace(R.id.tb, secondFragment);
break;
case 2:
thirdFragment = new ThirdFragment();
transaction.replace(R.id.tb, thirdFragment);
break;
case 3:
fourthFragment = new FourthFragment();
transaction.replace(R.id.tb, fourthFragment);
break;
}
2)、注釋 //hideFragment(transaction);這個(gè)方法
6、最后貼出TextBadgeItem和ShapeBadgeItem的屬性圖
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:android 使用kotlin 實(shí)現(xiàn)點(diǎn)擊更換全局語(yǔ)言(中日英切換)
欄 目:Android
本文標(biāo)題:Android BottomNavigationBar底部導(dǎo)航的使用方法
本文地址:http://www.jygsgssxh.com/a1/Android/9118.html
您可能感興趣的文章
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實(shí)現(xiàn)雙擊返回鍵退出應(yīng)用實(shí)現(xiàn)方法詳解
- 01-10android實(shí)現(xiàn)記住用戶名和密碼以及自動(dòng)登錄
- 01-10android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
- 01-10Android 友盟第三方登錄與分享的實(shí)現(xiàn)代碼
- 01-10android實(shí)現(xiàn)指紋識(shí)別功能
- 01-10Emoji表情在Android JNI中的兼容性問(wèn)題詳解
- 01-10Android實(shí)現(xiàn)圓形漸變加載進(jìn)度條
- 01-10android開(kāi)發(fā)環(huán)境中SDK文件夾下的所需內(nèi)容詳解
- 01-10android異步消息機(jī)制 源碼層面徹底解析(1)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實(shí)現(xiàn)雙擊返回鍵退出應(yīng)用實(shí)現(xiàn)方
- 01-10android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
- 01-10android實(shí)現(xiàn)記住用戶名和密碼以及自動(dòng)
- 01-10C++自定義API函數(shù)實(shí)現(xiàn)大數(shù)相乘算法
- 01-10Android 友盟第三方登錄與分享的實(shí)現(xiàn)代
- 01-10android實(shí)現(xiàn)指紋識(shí)別功能
- 01-10如何給Flutter界面切換實(shí)現(xiàn)點(diǎn)特效
- 01-10Android實(shí)現(xiàn)圓形漸變加載進(jìn)度條
- 01-10Emoji表情在Android JNI中的兼容性問(wèn)題詳
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文


