1. 程式人生 > >Android丨BottomNavigationView專案大於3切換效果

Android丨BottomNavigationView專案大於3切換效果

問題描述:

這幾天在開發專案時,使用Android自帶的BottomNavigationView來切換佈局

Navigation數目<3時,底部操作欄不會隱藏導航字型,如圖:


但是如果專案數量大於3時,會出現以下效果


這樣的效果雖然很好地解決了佈局,但不能很好地迎合主流設計。

解決辦法:

點進專案的 

BottomNavigationMenuView.java 

 mShiftingMode = mMenu.size() > 3;
    for (int i = 0; i < mMenu.size(); i++) {
        mPresenter.setUpdateSuspended(true
); mMenu.getItem(i).setCheckable(true); mPresenter.setUpdateSuspended(false); BottomNavigationItemView child = getNewItem(); mButtons[i] = child; child.setIconTintList(mItemIconTint); child.setTextColor(mItemTextColor); child.setItemBackground(mItemBackgroundRes
); child.setShiftingMode(mShiftingMode); child.initialize((MenuItemImpl) mMenu.getItem(i), 0); child.setItemPosition(i); child.setOnClickListener(mOnClickListener); addView(child); } mSelectedItemPosition = Math.min(mMenu.size() - 1, mSelectedItemPosition
); mMenu.getItem(mSelectedItemPosition).setChecked(true); }
會發現,導航的切換模式,是由
mShiftingMode = mMenu.size() > 3;
控制的,那麼我們在帶NavigationView中的類中,通過反射機制修改這個數字,那麼就可以成功修改NavigationBar>3時的

切換模式了:

//反射NavigationView切換模式
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);
            item.setChecked(item.getItemData().isChecked());
        }
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }