1. 程式人生 > >BottomNavigationView去除動畫,大於3項時不顯示文字的最新解決方案

BottomNavigationView去除動畫,大於3項時不顯示文字的最新解決方案

背景

今天在用 BottomNavigationView實現底部導航欄時出現了個小問題,效果如下:

當使用BottomNavigationView選單項多於3個時,去除動畫效果,顯示選單項文字。

初級方案

在網上看到解決方案是這樣:

/**
 * 建立時間:2018/10/30
 * 編寫人:kanghb
 * 功能描述:當使用BottomNavigationView選單項多於3個時,去除動畫效果,顯示選單項文字
 */
public class BottomNavigationViewHelper {
    @SuppressLint("RestrictedApi")
    public static void disableShiftMode(BottomNavigationView view) {
        //獲取子View BottomNavigationMenuView的物件
        BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
        try {
            //設定私有成員變數mShiftingMode可以修改
            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);
                //去除shift效果
                item.setShiftMode(false);
                item.setChecked(item.getItemData().isChecked());
            }
        } catch (NoSuchFieldException e) {
            Log.e("BNVHelper", "沒有mShiftingMode這個成員變數", e);
        } catch (IllegalAccessException e) {
            Log.e("BNVHelper", "無法修改mShiftingMode的值", e);
        }
    }
}

但是我引入的是

implementation 'com.android.support:appcompat-v7:28.0.0'

BottomNavigationItemView裡面並沒有setShiftMode方法,直接報錯,我看了下BottomNavigationItemView程式碼,貌似換成了setShifting方法,於是乎我就開心的換了,然並卵。後來我又發現BottomNavigationMenuView中也沒有mShiftingMode`變數,然後一臉懵逼,最後在stackoverflow發現瞭解決方案,嘻嘻

最終方案

很簡單就是在xml中給BottomNavigationView

加入這個屬性 app:labelVisibilityMode=”labeled” 即可大功告成。

 <android.support.design.widget.BottomNavigationView
            android:id="@+id/botton_navigation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:background="@color/ivory"
            android:elevation="@dimen/dp_16"
            app:labelVisibilityMode="labeled"
            app:menu="@menu/menu_bottom_nav">

 </android.support.design.widget.BottomNavigationView>