BottomNavigationView在Android p 之前为了解决item超过三个的动画问题,基本上都是利用这个工具类来实现:
public class BottomNavigationViewHelper {
public static void disableShiftMode(BottomNavigationView navigationView) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigationView.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 itemView = (BottomNavigationItemView) menuView.getChildAt(i);
itemView.setShiftingMode(false);
itemView.setChecked(itemView.getItemData().isChecked());
}
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
实现的方式:
BottomNavigationViewHelper.disableShiftMode(bottomNavigation);
但是最近升级了api(28)之后,发现这个不行了 itemView.setShiftingMode(false);报错了,新api里面已经不能用这个了,但是问题还是得解决的,查阅了而很多资料,包括去stack overfolw,最后解决方法是:
解除动画效果 : app:labelVisibilityMode="labeled"
设置icon和title大小固定
<dimen name="design_bottom_navigation_text_size">14sp</dimen>
<dimen name="design_bottom_navigation_active_text_size">14sp</dimen>
去除点击的效果:
app:itemBackground="@null"
处理item的文字颜色
Resources resource=(Resources)getBaseContext().getResources(); ColorStateList csl=(ColorStateList)resource.getColorStateList(R.color.colorGray); bnve.setItemTextColor(csl);