背景
今天在用 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>