Material Design 控件知識梳理(7) - BottomNavigationBar

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來承載這些子頁面溉愁,并會提供一組選項卡讓用戶通過點擊對應的選項的方式來進行頁面之間的快速切換混卵,而這一組選項卡根據(jù)擺放位置的不同,一般可以分為下面兩種實現(xiàn)方式:

  • 放在頂部玫氢,采用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>

在代碼中對數(shù)據(jù)進行初始化:

    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 BottomNavigationBarMode屬性

Mode的設置對應于這句:

mBottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);

這個屬性有兩種可選的值墅茉,MODE_FIXEDMODE_SHIFTING

  • MODE_FIXED:選中的Item會稍大于未選中的Item命黔,無論Item是否選中,都會顯示文字和圖標就斤。
  • MODE_SHIFTING:選中的Item明顯大于未選中的Item悍募,未選中的Item只顯示圖標,并且在選中項切換的時候洋机,會有一定的偏移效果坠宴。

2.1當中,我們演示的就是第一種方式绷旗,下面喜鼓,我們看一下第二種方式的效果:

mBottomNavigationBar.setMode(BottomNavigationBar.MODE_SHIFTING);

2.3 BottomNavigationBarBackgroundStyle屬性

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的文字和圖標的顏色一定是被激活顏色背桐,這需要根據(jù)BackgroundStyle來決定优烧,在每種模式下,被選中Item的文字圖片顏色链峭、未被選中的Item的文字圖標顏色畦娄、整個BottomNavigationBar的背景顏色的對應關(guān)系為:


也就是說,inActiveColor在任何時候都是未被選中Item的文字和圖片顏色弊仪,而其它兩種則不然:

  • static模式下熙卡,activeColor是被選中Item的文字圖標顏色,backgroundColorBottomNavigationBar的背景色
  • 而在ripple模式下撼短,恰巧是反過來再膳。

對于2.1中例子的Item 1,它的BackgroundStyleBACKGROUND_STYLE_STATIC曲横,因此在它被選中的時候喂柒,文字和圖片的顏色為給它設置的ActiveColor,而整個BottomNavigationBar的背景色為BackgroundColor禾嫉,現(xiàn)在我們看一下BACKGROUND_STYLE_RIPPLE的情況:

mBottomNavigationBar.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_RIPPLE);

2.4 給Item設置角標

通過BottomNavigationItemsetBadgeItem方法灾杰,可以給每個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 監(jiān)聽Item的切換

可以通過下面的方法來監(jiān)聽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從未選中狀態(tài)變?yōu)檫x中狀態(tài)時回調(diào)
  • onTabUnselected孽椰,某個Item從選中變?yōu)槲催x中時回調(diào)
  • onTabReselected昭娩,某個Item已經(jīng)處于選中狀態(tài),但是它又被再次點擊了黍匾,那么回調(diào)這個函數(shù)栏渺。

2.6 指定當前選中的位置

指定初始時刻的位置:

mBottomNavigationBar.setFirstSelectedPosition(3).initialise();

動態(tài)改變位置:

mBottomNavigationBar.selectTab(2);

2.7 初始化

在改變設置之后,需要在最后調(diào)用下面這句才會生效

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 根據(jù)列表的滾動來顯示和隱藏

如果我們的根布局使用的是CoordinatorLayout磕诊,那么可以通過給BottomNavigationBar設置內(nèi)置的Behavior來實現(xiàn)動態(tài)地顯示和隱藏,首先繼承于這個內(nèi)置的Bahavior,給它指定一個構(gòu)造函數(shù):

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>

只需要這兩部操作霎终,就可以實現(xiàn)動態(tài)地顯示和隱藏了:



更多文章滞磺,歡迎訪問我的 Android 知識梳理系列:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市莱褒,隨后出現(xiàn)的幾起案子击困,更是在濱河造成了極大的恐慌,老刑警劉巖保礼,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壹蔓,死亡現(xiàn)場離奇詭異喊式,居然都是意外死亡,警方通過查閱死者的電腦和手機伊者,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門坤候,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胁赢,“玉大人,你說我怎么就攤上這事白筹≈悄” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵徒河,是天一觀的道長系馆。 經(jīng)常有香客問我,道長顽照,這世上最難降的妖魔是什么由蘑? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮代兵,結(jié)果婚禮上尼酿,老公的妹妹穿的比我還像新娘。我一直安慰自己植影,他們只是感情好裳擎,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著思币,像睡著了一般鹿响。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谷饿,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天惶我,我揣著相機與錄音,去河邊找鬼各墨。 笑死指孤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恃轩,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼结洼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叉跛?” 一聲冷哼從身側(cè)響起松忍,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎筷厘,沒想到半個月后鸣峭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡酥艳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年摊溶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片充石。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡莫换,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骤铃,到底是詐尸還是另有隱情拉岁,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布惰爬,位于F島的核電站喊暖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏撕瞧。R本人自食惡果不足惜陵叽,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望风范。 院中可真熱鬧咨跌,春花似錦、人聲如沸硼婿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寇漫。三九已至刊殉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間州胳,已是汗流浹背记焊。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留栓撞,地道東北人遍膜。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓碗硬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓢颅。 傳聞我的和親對象是個殘疾皇子恩尾,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容