一、簡介
這是material design提供的一個標准底部導航欄的實現,可以輕松的實現導航欄菜單之間的切換與瀏覽。使用方式更加快捷方便,適用於擁有3-5個子菜單。
二、基本配置
(1)添加依賴:
(本人項目中使用的是較高版本的依賴)
項目中依賴:implementation 'com.android.support:design:28.0.0-rc02'
最新依賴:compile 'com.android.support:design:+'(容易出錯,依賴沖突)
指定依賴:compile 'com.android.support:design:26.1.0'
(2)添加布局:
<android.support.design.widget.BottomNavigationView android:id="@+id/bnv_menu" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" app:itemBackground="@color/colorPrimary" app:itemIconTint="@drawable/main_bottom" app:itemTextColor="@drawable/main_bottom" />
(3)屬性說明:
itemBackground: 設置導航欄的背景顏色
itemIconTint: 設置導航欄中圖片的顏色
itemTextColor: 設置導航欄中文字的顏色
三、代碼運用
(1)指定導航欄菜單
布局設置 :
<android.support.design.widget.BottomNavigationView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/bottomNavigationView" app:itemBackground="@color/gray" app:itemIconTint="@drawable/main_bottom" app:itemTextColor="@drawable/main_bottom" app:menu="@menu/menu_bottom_navigation_view" />
app:menu :引用菜單布局
clipboard.png
menu_bottom_navigation_view.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/item_bottom_1" android:enabled="true" android:icon="@mipmap/set" android:title="選項一" app:showAsAction="ifRoom" /> <item android:id="@+id/item_bottom_2" android:enabled="true" android:icon="@mipmap/set" android:title="選項二" app:showAsAction="ifRoom" /> <item android:id="@+id/item_bottom_3" android:enabled="true" android:icon="@mipmap/set" android:title="選項三" app:showAsAction="ifRoom" /> </menu>
效果圖:
1.gif
(2)代碼添加導航欄菜單
無需指定菜單布局:
<android.support.design.widget.BottomNavigationView android:id="@+id/bnv_menu" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" app:itemBackground="@color/colorPrimary" app:itemIconTint="@drawable/main_bottom" app:itemTextColor="@drawable/main_bottom" />
動態添加菜單項(Item):
Menu menu = bnvMenu.getMenu(); menu.add(0,i,i,"標題一");//設置菜單標題 MenuItem item = menu.findItem(i); item.setIcon(R.mipmap.set);//設置菜單圖片
刪除最后一個菜單項(Item):
bnvMenu.getMenu().removeItem(bnvMenu.getMenu().size()-1);
效果圖:
3.gif
(3)設置選中菜單顏色
app:itemIconTint="@drawable/main_bottom"
app:itemTextColor="@drawable/main_bottom"
main_bottom.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/green" android:state_checked="true" /> <item android:color="@color/white" android:state_checked="false" /> </selector>
(4)常用方法
//設置默認選中item bottomNavigationView.getMenu().getItem(1).setChecked(true);
//設置導航欄菜單項Item選中監聽 bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { String title = item.getTitle().toString(); switch (item.getItemId()) { case R.id.item_bottom_1: RxToast.showToastShort(activity, title); break; case R.id.item_bottom_2: RxToast.showToastShort(activity, title); break; case R.id.item_bottom_3: RxToast.showToastShort(activity, title); break; } return true; } });
(5)超過3個菜單項動畫效果問題
看了許多博客歸納后的解決方法
一、新api去除動畫的方法:
//默認動畫 bottomNavigationView.setLabelVisibilityMode(0); //默認清除動畫(顯示文字) bottomNavigationView.setLabelVisibilityMode(1); 或布局中添加:app:labelVisibilityMode="labeled"
二、舊api去除動畫的方法
@SuppressLint("RestrictedApi") public static void disableShiftMode(BottomNavigationView view) { BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0); try { Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode"); shiftingMode.setAccessible(true); shiftingMode.setBoolean(menuView, false); shiftingMode.setAccessible(false); for (int i = 0; i < menuView.getChildCount(); i++) { BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i); //去除動畫 item.setShiftingMode(false); //api 28之前 item.setChecked(item.getItemData().isChecked()); } } catch (NoSuchFieldException e) { LogUtils.e( "Unable to get shift mode field"); } catch (IllegalAccessException e) { LogUtils.e( "Unable to change value of shift mode"); } }
四、源碼地址
https://github.com/DayorNight/BLCS
五、參考文檔
官方文檔:https://developer.android.google.cn/reference/android/support/design/widget/BottomNavigationView
六、內容推薦
CSDN地址:https://blog.csdn.net/cs_lwb/article/details/82979521
作者:斌林誠上
鏈接:https://www.jianshu.com/p/5993e8037d4d
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
