BottomNavigationView 关闭 shiftingMode

0.077字数 117阅读 3261

android support library 25.0.0 版本添加了 BottomNavigationView

使用方式 ( 简要阐述 )

// 首先定义要展示的 menu 
// menu_bottom_navigation.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_content"
        android:icon="@mipmap/ic_launcher"
        android:title="内容" />

    <item android:id="@+id/action_detail"
        android:icon="@mipmap/ic_launcher"
        android:title="详情" />

    <item android:id="@+id/action_info"
        android:icon="@mipmap/ic_launcher"
        android:title="资讯" />

    <item android:id="@+id/action_featured"
        android:icon="@mipmap/ic_launcher"
        android:title="精选" />
</menu>
// 然后在布局文件中引用即可
<android.support.design.widget.BottomNavigationView    
    android:id="@+id/bnv_bottom_menu"    
    android:layout_width="match_parent"    
    android:layout_height="wrap_content"    
    android:layout_alignParentBottom="true"    
    app:itemIconTint="@android:color/holo_purple"    
    app:itemTextColor="@android:color/tab_indicator_text"    
    app:menu="@menu/menu_bottom_navigation" />

3个 item 时候是这样



4 ~ 5个 item 时候就变成这样了( 选中的 item 会被放大 )



当 item 数目大于 3 个之后,会有 mShiftingMode 这个 boolean 变量控制 item 的缩放比例

去除菜单项目大于 3 个之后,菜单项目缩放的方式

// 利用发射机制,改变 item 的 mShiftingMode 变量
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 e) {
      // Log
    } catch (IllegalAccessException e) {
      // Log
    }
  }
}

使用方式

BottomNavigationView bottomNavigationView = 
    (BottomNavigationView) findViewById(R.id.bnv_bottom_menu);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);

注意,每次修改 menu 都要调用 helper 的方法

推荐阅读更多精彩内容