BottomNavigationView 关闭 shifting

作者: ChristmasJason | 来源:发表于2016-11-18 00:05 被阅读2588次

    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 的方法

    相关文章

      网友评论

        本文标题:BottomNavigationView 关闭 shifting

        本文链接:https://www.haomeiwen.com/subject/dcjjpttx.html