当前位置: 首页 > 知识库问答 >
问题:

如何禁用BottomNavigationView移位模式?

顾炎彬
2023-03-14

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

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

共有1个答案

芮歌者
2023-03-14

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

此时,您无法通过现有API对其进行更改,禁用shift模式的唯一方法是使用反射。

您将需要helper类:

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 bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);

您还需要更新proguard配置文件(例如,proGuard-rules.pro),上面的代码使用反射,如果proguard混淆mshiftingmode字段,则不能工作。

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

感谢Muhammad Alfaifi指出这个问题并提供片段。

更新2

<com.google.android.material.bottomnavigation.BottomNavigationView
    ...
    app:labelVisibilityMode="labeled"
    ... 
/>
 类似资料:
  • 我有这个方法: 我试着用这个方法颠倒过来: 这样调用这些方法: 结果: 我感兴趣的结果最终得到的值为FFFFFFB6;我需要FFFFFFB2。 setParameters方法不起作用,为什么?

  • 本文向大家介绍如何禁用移动的选择高亮?相关面试题,主要包含被问及如何禁用移动的选择高亮?时的应答技巧和注意事项,需要的朋友参考一下

  • 我需要帮助组合ViewPager和BottomNavigationView。但当我在ViewPager工作时滑动屏幕时,该片段会与另一个片段堆叠在一起。我怎么解决这个? 堆叠碎片 扫描前的正常片段 下面是我的代码: mainactivity.java activity_main.xml ViewPagerAdapter.java 提前道谢!

  • 我正在将一个服务从Flask迁移到FastAPI,并使用Pydantic模型来生成文档。但是,我对模式检查有点不确定。我担心会有一些意想不到的数据(如不同的字段格式),它会返回一个错误。 在Pydantic文档中,有一些方法可以在不检查模式的情况下创建模型:https://Pydantic-docs . help manual . io/usage/models/# creating-models

  • 我正在做Liferay 6.2项目。在Liferay中,他们使用了Vaadin。当我点击一个按钮时,它会打开一个不同的iframe。我可以为所有功能编写代码。现在我想使用WebDriver将光标移动到iframe元素。因为当我将鼠标移动到iframe复选框之后,我的自动脚本就可以运行了。我想自动化一个脚本,将鼠标指针移动到元素。 我已经尝试了下面的代码,但它不起作用。 1) 使用动作移动元素: 2

  • 我想从Android谷歌地图V2中删除蓝色精确圆圈。 我找到了移除圆圈和标记的方法,并添加了新的标记,但对我来说,这似乎不酷。我只想办法禁用那个圆圈。