android - 使用设计支持库的android底部导航菜单中超过3个项目

标签 android android-support-library android-menu bottomnavigationview

我正在使用 android 设计支持库 V 25.0.0 创建底部导航菜单。我在菜单中配置了 5 个项目。但只有 3 个项目带有标题。我希望所有 5 个项目都显示为图标和标题。

有没有人能够做到这一点?

<menu xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:id="@+id/action_search"
      android:title="@string/menu_search"
      android:icon="@drawable/ic_search" />
 <item android:id="@+id/action_settings"
      android:title="@string/menu_settings"
      android:icon="@drawable/ic_add" />
   ....... three more items

布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"        android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="horizontal"
xmlns:app="http://schemas.android.com/apk/res-auto">
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@color/white"
app:itemTextColor="@color/white"
app:menu="@menu/bottom_bar_tabs"
/>
</RelativeLayout>

最佳答案

BottomNavigationView的实现有条件:当超过3个项目时,使用移位模式。

目前您无法通过现有 API 更改它,禁用移位模式的唯一方法是使用反射。

你需要帮助类:

import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import android.util.Log;
import java.lang.reflect.Field;

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);
        }
    }
}

然后在您的 BottomNavigationView 上应用 disableShiftMode 方法,但请记住,如果您从代码中膨胀菜单 View ,则必须在膨胀后执行它。

示例用法:
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);

重要的

请记住,每次更改 BottomNavigationView 中的菜单项时都需要执行此方法。

关于android - 使用设计支持库的android底部导航菜单中超过3个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41878096/

相关文章:

android - 添加的 EditText 不是 TextInputEditText。请改用该类(class)

android - 有没有办法改变菜单项图标和文本的颜色?

android - java.lang.IllegalArgumentException : No injector factory bound for Class<MyActivity_> 异常

android - 使用同步适配器 Volley/RoboSpice 同步处理网络请求

android - 以编程方式添加 TextInputLayout

android - 如何更改底部导航 Activity 的菜单布局文件的设计选项卡 View (工具 :showIn)

android - 所有 api 的 MenuItem 色调 - api > 26 的 iconTint -

android - 我怎样才能在 Android 中做到这一点。 Activity -> WebBrowser -> Activity,但按返回键看不到 WebBrowser

java - 在 Firebase 中存储/检索枚举的解决方法是什么?

Android 支持操作栏不显示溢出菜单