API28 BottomNavigationView 去除位移方式 Android篇——程序员之路

BottomNavigationView按钮超过3个会产生位置移动的效果,这是BottomNavigationView自带的特效

API28 之前

在API28 以前 可以通过 以下方法取消位移

public void disableShiftMode(BottomNavigationView navigationView) {

BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigationView.getChildAt(0);

    try {

// 利用反射,改变 item 中 mShiftingMode 的值 ,从而改变 BottomNavigationView 默认的效果

        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 itemView = (BottomNavigationItemView) menuView.getChildAt(i);

            itemView.setShiftingMode(false);

            itemView.setChecked(itemView.getItemData().isChecked());

        }

}catch (NoSuchFieldException | IllegalAccessException e) {

e.printStackTrace();

    }

}

然后,每次 获取 BottomNavigationView 的时候 调用该方法。


BottomNavigationView navigation = findViewById(R.id.navigation);

disableShiftMode(navigation);

悲催的是 API28 取消了 setShiftingMode 方法,不能再使用这样的方式了。

API28 新方式

方式一:

XML:BottomNavigationView 中添加 app:labelVisibilityMode="labeled" 属性

JAVA: 然后在java代码中 .setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
BottomNavigationView navigation = findViewById(R.id.navigation);

navigation.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);

方式二: 跟 API28之前的方式类似

@SuppressLint("RestrictedApi")
public static void removeNavigationShiftMode(BottomNavigationView view) { 

 BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0); menuView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);

 menuView.buildMenuView();

}

愉快的解决了!

你可能感兴趣的:(API28 BottomNavigationView 去除位移方式 Android篇——程序员之路)