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" 属性
<android.support.design.widget.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();
}
愉快的解决了!
网友评论