实施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"
没有Enabled
postfix 禁用移动动画。
您可以查看有关设计 BottomNavigation 样式的完整指南here https://mikescamell.com/bottoms-up-bottomnavigationview-updates-in-the-material-design-design-support-library/index.html