Material Design 控件知識梳理(1) - Android Design Support Library 是什么
Material Design 控件知識梳理(2) - AppBarLayout & CollapsingToolbarLayout
Material Design 控件知識梳理(3) - BottomSheet && BottomSheetDialog && BottomSheetDialogFragment
Material Design 控件知識梳理(4) - FloatingActionButton
Material Design 控件知識梳理(5) - DrawerLayout && NavigationView
Material Design 控件知識梳理(6) - Snackbar
Material Design 控件知識梳理(7) - BottomNavigationBar
Material Design 控件知識梳理(8) - TabLayout
Material Design 控件知識梳理(9) - TextInputLayout
一、概述
當某個主頁面有多個子頁面時,我們一般會采用ViewPager
來承載這些子頁面,并會提供一組選項卡讓用戶通過點擊對應的選項的方式來進行頁面之間的快速切換,而這一組選項卡根據擺放位置的不同,一般可以分為下面兩種實現方式:
- 放在頂部,采用
TabLayout
- 放在底部,采用
BottomNavigationBar
今天,我們介紹第二種方式。
二、BottomNavigationBar
詳解
2.1 基本用法
引入依賴包:
compile 'com.ashokvarma.android:bottom-navigation-bar:1.2.0'
在布局當中引入控件,這里,我們將它放置在容器的底部:
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.demo.lizejun.repotransition.NavigationBarActivity">
<com.ashokvarma.bottomnavigation.BottomNavigationBar
android:id="@+id/bottom_navigation"
android:layout_gravity="bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</android.support.design.widget.CoordinatorLayout>
在代碼中對數據進行初始化:
private void initViews() {
mBottomNavigationBar = (BottomNavigationBar) findViewById(R.id.bottom_navigation);
//1.設置Mode
mBottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);
//2.設置BackgroundStyle
mBottomNavigationBar.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC);
//3.設置背景色
mBottomNavigationBar.setBarBackgroundColor(android.R.color.white);
//4.設置每個Item
mBottomNavigationBar.addItem(new BottomNavigationItem(R.drawable.ic_1, "Item 1").setActiveColorResource(android.R.color.holo_blue_dark));
mBottomNavigationBar.addItem(new BottomNavigationItem(R.drawable.ic_2, "Item 2").setActiveColorResource(android.R.color.holo_green_dark));
mBottomNavigationBar.addItem(new BottomNavigationItem(R.drawable.ic_3, "Item 3").setActiveColorResource(android.R.color.holo_orange_dark));
mBottomNavigationBar.addItem(new BottomNavigationItem(R.drawable.ic_4, "Item 4").setActiveColorResource(android.R.color.holo_green_dark));
mBottomNavigationBar.addItem(new BottomNavigationItem(R.drawable.ic_5, "Item 5").setActiveColorResource(android.R.color.holo_orange_dark));
//5.初始化
mBottomNavigationBar.initialise();
}
上面代碼的運行效果如下圖所示:
可以看到,上面我們設置了很多的屬性,下面我們就一一來講解各個屬性的含義。
2.2 BottomNavigationBar
的Mode
屬性
Mode
的設置對應于這句:
mBottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);
這個屬性有兩種可選的值,MODE_FIXED
和MODE_SHIFTING
-
MODE_FIXED
:選中的Item
會稍大于未選中的Item
,無論Item
是否選中,都會顯示文字和圖標。 -
MODE_SHIFTING
:選中的Item
明顯大于未選中的Item
,未選中的Item
只顯示圖標,并且在選中項切換的時候,會有一定的偏移效果。
在2.1
當中,我們演示的就是第一種方式,下面,我們看一下第二種方式的效果:
mBottomNavigationBar.setMode(BottomNavigationBar.MODE_SHIFTING);
2.3 BottomNavigationBar
的BackgroundStyle
屬性
BackgroundStyle
的設置對應于這句:
mBottomNavigationBar.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC);
這個屬性有兩個可選的值:
BACKGROUND_STYLE_STATIC
BACKGROUND_STYLE_RIPPLE
這兩種選項決定了兩點:整個BottomNavigationBar
的顏色和被選中Item
的顏色,在解釋這個之前,我們需要先了解一下三種顏色:
-
barBackgroudColor
:只能通過BottomNavigationBar
來設置
mBottomNavigationBar.setBarBackgroundColor(android.R.color.white);
-
activeColor
:被激活顏色,可以通過BottomNavigationBar
來進行全局的設置,也可以給每個Item
單獨設置
mBottomNavigationBar.addItem(new BottomNavigationItem(R.drawable.ic_1, "Item 1").setActiveColorResource(android.R.color.holo_blue_dark));
-
inActiveColor
:未被激活顏色,可以通過BottomNavigationBar
來進行全局的設置,也可以給每個Item
單獨設置。
注意到,上面這三種顏色并不是說被選中的Item
的文字和圖標的顏色一定是被激活顏色,這需要根據BackgroundStyle
來決定,在每種模式下,被選中Item
的文字圖片顏色、未被選中的Item
的文字圖標顏色、整個BottomNavigationBar
的背景顏色的對應關系為:
也就是說,
inActiveColor
在任何時候都是未被選中Item
的文字和圖片顏色,而其它兩種則不然:
- 在
static
模式下,activeColor
是被選中Item
的文字圖標顏色,backgroundColor
為BottomNavigationBar
的背景色 - 而在
ripple
模式下,恰巧是反過來。
對于2.1
中例子的Item 1
,它的BackgroundStyle
為BACKGROUND_STYLE_STATIC
,因此在它被選中的時候,文字和圖片的顏色為給它設置的ActiveColor
,而整個BottomNavigationBar
的背景色為BackgroundColor
,現在我們看一下BACKGROUND_STYLE_RIPPLE
的情況:
mBottomNavigationBar.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_RIPPLE);
2.4 給Item
設置角標
通過BottomNavigationItem
的setBadgeItem
方法,可以給每個Item
設置一個獨立的角標,對于角標支持設置它的背景、文案、文案顏色以及在選中時是否隱藏角標:
BadgeItem badgeItem = new BadgeItem()
.setBackgroundColorResource(android.R.color.holo_red_dark) //設置角標背景色
.setText("5") //設置角標的文字
.setTextColorResource(android.R.color.white) //設置角標文字顏色
.setHideOnSelect(true); //在選中時是否隱藏角標
mBottomNavigationBar.addItem(new BottomNavigationItem(R.drawable.ic_5, "Item 5")
.setActiveColorResource(android.R.color.holo_orange_dark)
.setBadgeItem(badgeItem));
效果如下圖所示:
2.5 監聽Item
的切換
可以通過下面的方法來監聽Item
之間的切換:
mBottomNavigationBar.addItem(new BottomNavigationItem(R.drawable.ic_5, "Item 5").setActiveColorResource(android.R.color.holo_orange_dark).setBadgeItem(badgeItem));
mBottomNavigationBar.setTabSelectedListener(new BottomNavigationBar.OnTabSelectedListener() {
@Override
public void onTabSelected(int position) {
Log.d("onTabSelected", "position=" + position);
}
@Override
public void onTabUnselected(int position) {
Log.d("onTabUnselected", "position=" + position);
}
@Override
public void onTabReselected(int position) {
Log.d("onTabReselected", "position=" + position);
}
});
-
onTabSelected
,某個Item
從未選中狀態變為選中狀態時回調 -
onTabUnselected
,某個Item
從選中變為未選中時回調 -
onTabReselected
,某個Item
已經處于選中狀態,但是它又被再次點擊了,那么回調這個函數。
2.6 指定當前選中的位置
指定初始時刻的位置:
mBottomNavigationBar.setFirstSelectedPosition(3).initialise();
動態改變位置:
mBottomNavigationBar.selectTab(2);
2.7 初始化
在改變設置之后,需要在最后調用下面這句才會生效
mBottomNavigationBar.initialise();
三、BottomNavigationBar
的顯示和隱藏
3.1 手動隱藏和顯示BottomNavigationBar
通過下面的兩個方法可以手動顯示和隱藏BottomNavigationBar
:
public void show(View view) {
mBottomNavigationBar.unHide(true);
}
public void hide(View view) {
mBottomNavigationBar.hide(true);
}
3.2 根據列表的滾動來顯示和隱藏
如果我們的根布局使用的是CoordinatorLayout
,那么可以通過給BottomNavigationBar
設置內置的Behavior
來實現動態地顯示和隱藏,首先繼承于這個內置的Bahavior
,給它指定一個構造函數:
public class BottomBehavior extends BottomVerticalScrollBehavior<BottomNavigationBar> {
public BottomBehavior(Context context, AttributeSet attributeSet) {
super();
}
}
把這個Behavior
設置給BottomNavigationBar
:
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.demo.lizejun.repotransition.NavigationBarActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_content"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<com.ashokvarma.bottomnavigation.BottomNavigationBar
android:id="@+id/bottom_navigation"
android:layout_gravity="bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="com.demo.lizejun.repotransition.behavior.BottomBehavior"/>
</android.support.design.widget.CoordinatorLayout>
只需要這兩部操作,就可以實現動態地顯示和隱藏了:
更多文章,歡迎訪問我的 Android 知識梳理系列:
- Android 知識梳理目錄:http://www.lxweimin.com/p/fd82d18994ce
- 個人主頁:http://lizejun.cn
- 個人知識總結目錄:http://lizejun.cn/categories/