这个控件作为Android原生的大弟子,有着很方便的操作性,来自于android.support:design包下,充斥着Material Design气息。但我在第一次用,就遇到了不解的问题------BottomNavigationView设置item数量三个以上会出现位移。这实际上是该控件的一个自带的动画效果,下面通过一个helper类解决。
默认情况下在res/menu下定义一个item_menu,它是显示在toolBar右侧的popMenu里.
这是创建menu时的预览效果,我想要的是让它展示在底部,作为导航栏.于是我通过覆写onCreateOptionsMenu关联了item_menu,当然也可以直接在xml使用时添加menu属性.
话不多说,浏览器崩了好几次了,不展示图片效果了,直接上解决办法:
public class BottomNavigationViewHelper {
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);
//noinspection RestrictedApi
item.setShiftingMode(false);
// set once again checked value, so view will be updated
// noinspection RestrictedApi
item.setChecked(item.getItemData().isChecked());
}
}catch (NoSuchFieldException e) {
Log.e("BNVHelper", "Unable to get shift mode field", e);
}catch (IllegalAccessException e) {
Log.e("BNVHelper", "Unable to change value of shift mode", e);
}
}
}
这段代码直接使用,问题就解决了。通过反射机制修改“mShiftingMode”属性。