问题
当BottomNavigationView设置的菜单中超过三个图标时,出现只有焦点聚集到图标时才会显示底部设置的文字描述,当没有焦点聚集则只显示图标,效果如下:
解决办法
设置labelVisibilityMode值
如果BottomNavigationItemView类并没有setShiftingMode方法
进入到BottomNavigationMenuView类中查看onMeasure方法,发现这个版本中判断方法已经改为isShifting
由isShifting方法可见,当labelVisibilityMode==0时或按钮数大于3则位移,那么只要将labelVisibilityMode值设置为不是0和-1就可以了。
在代码中直接设置labelVisibilityMode的值即可
bnvBottomNavigationView.setLabelVisibilityMode(1);
反射BottomNavigationViewHelper
因为官方的BottomNavigationView默认有个放大的ShiftingMode效果,但是尚未支持代码层级的切换。在3个menu item及以下时默认关闭,而到了4个及以上时默认开启,就会出现以上问题。
修改BottomNavigationMenuView的shiftMode属性
BottomNavigationMenuView的源码如下:
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();}}
}
新版在xml文件中配置属性
app:labelVisibilityMode="labeled"
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp"
android:background="?android:attr/windowBackground"
app:labelVisibilityMode="labeled"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/bottom_nav_menu" />