Android BottomNavigationView,底部導航欄的簡單實現

亦楓發表於2017-04-06

關於 Material Design 相關的控制元件,之前整理了一個系列文章,並在 GitHub 上建立一個 MDSamples 工程,使用程式碼和文字解說配合的方式逐一說明。截止目前,大致寫有八九篇文章。期間,由於一些工作變動和瑣事,停了一些時間。現在,有點時間,準備續上。

之前的文章,參考列表如下:

這一篇要說的是 Android App 中的 BottomNavigation 設計,底部導航欄,設計規範可參考官網:

Material Design Components 之 Bottom Navigation

support.design 包中對應提供的控制元件是 BottomNavigationView,提供不多於 5 個選單的底部導航欄實現。

我們先來看一下基本使用:

<android.support.design.widget.BottomNavigationView
    android:id="@+id/bnv_menu"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    app:itemIconTint="@color/selector_blue"
    app:itemTextColor="@color/selector_blue"
    app:menu="@menu/menu_bottom_navigation"/>複製程式碼

使用 menu 資源定義選單內容,也就是這裡的 res/menu/menu_bottom_navigation.xml 檔案:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/action_home"
        android:title="Home"
        android:icon="@drawable/ic_action_home"/>

    <item
        android:id="@+id/action_explore"
        android:title="Explore"
        android:icon="@drawable/ic_action_explore"/>

    <item
        android:id="@+id/action_me"
        android:title="Me"
        android:icon="@drawable/ic_action_me"/>

</menu>複製程式碼

除了 app:menu 屬性定義選單內容,BottomNavigationView 能夠使用的定製屬性並不多,有這幾個:

app:itemIconTint:Icon 圖示著色,值為一個 ColorStateList ,可以在 color 資原始檔夾中定義。使用這個屬性,奇妙利用 tint 著色器實現一個圖示多種狀態下使用。:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_checked="true" android:color="@color/blue"></item>
    <item android:color="@color/gray"></item>

</selector>複製程式碼

app:itemTextColor:Label 文字顏色定義。

app:itemBackground:背景內容。

效果如下:

Android BottomNavigationView,底部導航欄的簡單實現

上圖是 3 個選單時的展示和互動方式,即選單文字和圖示同時顯示,選中時有一個大小變化過程(這裡不是動畫,通過原始碼可以看到,其實只是一個簡單的尺寸上的瞬時縮放)。但是,當超過 3 個選單時,文字就不再顯示。對比看一下 5 個選單時的效果圖:

Android BottomNavigationView,底部導航欄的簡單實現

可以看到,互動方式也發生變化,選中有一個左右移動騰出空間的過程。那再多一點選單數量,比如 6 個時呢?對不起,要報錯啦,不支援!

注意:根據 Material Design 對底部導航欄的設計要求,BottomNavigationView 只支援 3 到 5 個子選單數量的導航欄。並且,考慮到使用者體驗,3 個及3個以下選單數量的導航欄,與超過 3 個時,互動過程也有所區分。關於最多支援 5 個字選單的內容,可以從 BottomNavigationView 原始碼中檢視:
public static final int MAX_ITEM_COUNT = 5;
當超出這個數量時,產生非法引數異常。

通過 setOnNavigationItemSelectedListener() 方法可以監聽不同子選單的選中切換事件。但是,竟然沒有一個簡便的方法直接設定選中某個子選單,就像 check(id) 這樣。不知是不是 BottomNavigationView 控制元件設計時的遺漏。目前能夠想到的一個做法就是獲取 menu item 物件,利用 performClick() 模擬點選事件,如:

BottomNavigationView view = (BottomNavigationView) findViewById(R.id.bnv_menu);
view.findViewById(R.id.action_explore).performClick();複製程式碼

以上便是 BottomNavigationView 的所有內容,按照 Android 上的 Bottom Navigation 設計規範定製而成。可以看出,使用起來還是很簡單的。同時,可定製性也非常有限。比如,想在底部某個子選單新增一個小紅點提示的檢視,就有些難以處理。如果使用 RadioGroup 實現導航欄的話,就靈活一些。

附:GitHub 站有一個 BottomNavigationBar 開源專案,專門針對 Material Design 風格的 Bottom Navigation 量身定製的,可供參考。

關於我:亦楓,部落格地址:yifeng.studio/,新浪微博:IT亦楓

微信掃描二維碼,歡迎關注我的個人公眾號:安卓筆記俠

不僅分享我的原創技術文章,還有程式設計師的職場遐想

Android BottomNavigationView,底部導航欄的簡單實現

相關文章