如何禁用 BottomNavigationView 移动模式?

2023-12-30

BottomNavigationView 不显示非活动菜单的标题。

如何在bottomNavigationBar中显示所有菜单元素的标题? 问题是在我的例子中仅显示了单击的元素的标题。


实施BottomNavigationView有条件:当有超过3个项目时,则使用shift模式。

目前您无法通过现有 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);
        }
    }
}

然后申请disableShiftMode方法对你的BottomNavigationView,但请记住,如果您要从代码中膨胀菜单视图,则必须在膨胀后执行它。

用法示例:

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

PS.

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

UPDATE

您还需要更新 proguard 配置文件(例如 proguard-rules.pro),上面的代码使用反射,如果 proguard 混淆了该文件,则上述代码将无法工作mShiftingMode field.

-keepclassmembers class android.support.design.internal.BottomNavigationMenuView { 
    boolean mShiftingMode; 
}

感谢穆罕默德·阿尔法菲的指点这个问题 https://stackoverflow.com/questions/40176244/how-to-disable-bottomnavigationview-shift-mode/40189977?noredirect=1#comment69921218_40189977 and 提供片段 https://stackoverflow.com/questions/40176244/how-to-disable-bottomnavigationview-shift-mode/40189977?noredirect=1#comment69922205_40189977.

UPDATE 2

正如 Jolanda Verhoef 指出的新支持库 (28.0.0-alpha1)以及新的材料组件库 https://github.com/material-components/material-components-android (1.0.0-beta01)提供了一个公共属性,可用于操纵 3 个菜单项的切换模式。

<com.google.android.material.bottomnavigation.BottomNavigationView
    ...
    app:labelVisibilityMode="labeled"
    ... 
/>

在材质组件库中,如果有 5 个菜单项,它也适用。

UPDATE 3

正如@ThomasSunderland 还指出的,您可以将此属性设置为 falseapp:itemHorizontalTranslation="false"没有Enabledpostfix 禁用移动动画。

您可以查看有关设计 BottomNavigation 样式的完整指南here https://mikescamell.com/bottoms-up-bottomnavigationview-updates-in-the-material-design-design-support-library/index.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何禁用 BottomNavigationView 移动模式? 的相关文章

随机推荐