Answers:
BottomNavigationView
有条件的实现:当有3个以上的项目时,使用班次模式。
目前,您无法通过现有的API对其进行更改,并且禁用shift模式的唯一方法是使用反射。
您将需要帮助程序类:
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
。
更新
您还需要更新proguard配置文件(例如proguard-rules.pro),上面的代码使用反射,如果proguard混淆了该mShiftingMode
字段,则该代码将不起作用。
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
感谢Muhammad Alfaifi指出了这个问题并提供了摘要。
更新2
正如Jolanda Verhoef指出的那样,新的支持库(28.0.0-alpha1
)和新的材料组件库(1.0.0-beta01
)提供了一个公共属性,可用于操纵3个菜单项上的切换模式。
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"
...
/>
在Material Components库中,如果有5个菜单项,则也适用。
更新3
正如@ThomasSunderland也指出的那样,您可以将此属性设置为false,app:itemHorizontalTranslation="false"
而无需使用Enabled
后缀来禁用移动动画。
您可以在此处查看有关BottomNavigation样式的完整指南
从支持库28.0.0-alpha1开始:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
app:
不是android:
要禁用文本动画,您还可以在dimens.xml文件中使用此动画:
<dimen name="design_bottom_navigation_active_text_size">12sp</dimen>
您可能还需要在清单中添加以下内容:
tools:override="true"
tools:override="true"
<dimen name="design_bottom_navigation_active_text_size" tools:ignore="PrivateResource">12sp</dimen>
您现在可以app:labelVisibilityMode="[labeled, unlabeled, selected, auto]"
在28-alpha
labeled
将保持所有标签可见。unlabeled
将仅显示图标。selected
将仅显示所选项目和班次项目的标签。auto
将根据您拥有的商品数量选择带标签或已选择。标记为1-3项,选择为3+项。Przemysław在Kotlin中的答案是扩展功能
@SuppressLint("RestrictedApi")
fun BottomNavigationView.disableShiftMode() {
val menuView = getChildAt(0) as BottomNavigationMenuView
try {
val shiftingMode = menuView::class.java.getDeclaredField("mShiftingMode")
shiftingMode.isAccessible = true
shiftingMode.setBoolean(menuView, false)
shiftingMode.isAccessible = false
for (i in 0 until menuView.childCount) {
val item = menuView.getChildAt(i) as BottomNavigationItemView
item.setShiftingMode(false)
// set once again checked value, so view will be updated
item.setChecked(item.itemData.isChecked)
}
} catch (e: NoSuchFieldException) {
Log.e(TAG, "Unable to get shift mode field", e)
} catch (e: IllegalStateException) {
Log.e(TAG, "Unable to change value of shift mode", e)
}
}
用法(与Kotlin Android扩展一起使用):
bottom_navigation_view.disableShiftMode()
更新
在Android SDK版本28及更高版本中,它们已更改item.setShiftingMode(false)
为item.setShifting(false)
他们也删除了领域 mShiftingMode
因此用法将是
BottomNavigationHelper.removeShiftMode(bottomNav);
bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
private static final class BottomNavigationHelper {
@SuppressLint("RestrictedApi")
static void removeShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
//noinspection RestrictedApi
item.setShifting(false);
item.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
// set once again checked value, so view will be updated
//noinspection RestrictedApi
item.setChecked(item.getItemData().isChecked());
}
}
}
正如其他人指出的那样,由于支持库28.0.0-alpha1,因此可能:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
或者您可以通过编程设置它。
注意:如果要从较旧版本的支持库升级,请不要忘记提高编译SDK版本。在此处检查支持libraray的版本:支持库版本
但是,如果您的应用程序依赖于设计支持库的较早版本,则在编译时仍然可能会收到labelVisibilityMode not found消息。如果是这种情况,请尝试升级到给定依赖性的版本,该依赖性至少取决于设计支持库的28.0.0-alpha1版本。如果不可能,请显式定义依赖项。
如果您使用Gradle
要在build.gradle中显式添加设计支持依赖性:
实施'com.android.support:design:28.0.0'
对于使用默认值的更新答案。更新到最新的设计库
实现“ com.android.support:design:28.0.0”
并放入您的BottomNavigationView xml属性
app:itemHorizontalTranslationEnabled="false"
您也可以以编程方式
bottomNavigationView.setItemHorizontalTranslationEnabled(false);
您可以在此处找到源代码BottomNavigationView
希望对您有帮助。
app:labelVisibilityMode
?
给你BottomNavigationView
加app:labelVisibilityMode="unlabeled"
<android.support.design.widget.BottomNavigationView
app:menu="@menu/bn_menu"
android:layout_height="56dp"
android:layout_width="match_parent"
app:labelVisibilityMode="unlabeled">
</android.support.design.widget.BottomNavigationView>
结果如下
非常简单,只需在BottomNaviationView中添加一个属性
app:labelVisibilityMode="unlabeled"
我在BottomNavigationView上有一些奇怪的行为。当我在其中选择任何项目/片段时,该片段将BottomNavigationView推低一点,因此BottomNavigationView的文本位于屏幕下方,因此单击任何项目时仅可见图标并且隐藏文本。
如果您面对这种奇怪的行为,那么这就是解决方案。只需删除
android:fitsSystemWindows="true"
在片段的根布局中。只需移除此杆即可!BottomNavigationView可以正常工作,现在可以用文本和图标显示。我在片段的根CoordinatorLayout中有此选项。
也不要忘记添加
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
在您的活动中禁用换档模式。尽管它与提出的问题并不完全相关,但我仍然认为这很有帮助。
这是我使用的第三方库,它具有许多自定义选项,例如禁用切换模式,仅显示图标,设置图标大小等 。BottomNavigationViewEx
如果您还想摆脱那种烦人的小顶边动画,则需要更多的反射代码。这是删除所有动画的完整解决方案:
@SuppressLint("RestrictedApi")
private 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);
item.setShiftingMode(false);
Field shiftAmount = item.getClass().getDeclaredField("mShiftAmount");
shiftAmount.setAccessible(true);
shiftAmount.setInt(item, 0);
shiftAmount.setAccessible(false);
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
Timber.e(e, "Unable to get fields");
} catch (IllegalAccessException e) {
Timber.e(e, "Unable to change values");
}
}
并确保将其添加到您的proguard配置文件中:
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
-keepclassmembers class android.support.design.internal.BottomNavigationItemView {
int mShiftAmount;
}
如果您使用的是support:design:28.0.0,请将此行app:labelVisibilityMode =“ unlabeled”添加到您的BottomNavigationView中
https://android.jlelse.eu/disable-shift-label-animation-from-bottom-navigation-android-b42a25dcbffc
1个
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:itemHorizontalTranslationEnabled="false"/>
2
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"/>
3
<resources xmlns:tools="http://schemas.android.com/tools">
<dimen name="design_bottom_navigation_active_text_size"
tools:override="true">12sp</dimen>
您可以使用它在BottomNevigationView上同时显示3到5个项目的文本和图标,并停止移动。
app:labelVisibilityMode="labeled"
但是您将在BottmNevigationView上遇到5个项目的长文本切割问题。为此,我找到了一个很好的解决方案,可以停止文本以及BottomNevigationView的图标移动。您还可以停止移动文本以及BottomNevigationView上的图标。此处提供了代码片段。
1.在BottomNevigationView中添加以下代码行,如图所示
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="@dimen/seventy_dp"
android:layout_semitransparent="true"
android:background="@color/colorBottomNev"
android:showAsAction="always|withText"
app:itemIconTint="@drawable/bottom_navigation_colors"
app:itemTextColor="@drawable/bottom_navigation_colors"
app:itemTextAppearanceActive="@style/BottomNavigationViewTextStyle"
app:itemTextAppearanceInactive="@style/BottomNavigationViewTextStyle"
app:menu="@menu/bottom_navigation_menu"
app:labelVisibilityMode="labeled"/>
2.添加菜单项,如下所示:-
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_catalogue"
android:icon="@drawable/catalogue"
android:title="@string/catalogue"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_contracts"
android:icon="@drawable/contract"
android:title="@string/contracts"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_prospects"
android:icon="@drawable/prospect"
android:title="@string/prospects"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_performance"
android:icon="@drawable/performance"
android:title="@string/performance"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_advance"
android:icon="@drawable/advance"
android:title="@string/advance"
android:enabled="true"
app:showAsAction="ifRoom" />
</menu>
3.在style.xml文件中添加以下样式:
<style name="BottomNavigationViewTextStyle">
<item name="android:fontFamily">@font/montmedium</item>
<item name="android:textSize">10sp</item>
<item name="android:duplicateParentState">true</item>
<item name="android:ellipsize">end</item>
<item name="android:maxLines">1</item>
</style>
4)将它们添加到Dimen文件夹中
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<dimen name="design_bottom_navigation_text_size" tools:override="true">10sp</dimen>
<dimen name="design_bottom_navigation_active_text_size" tools:override="true">10sp</dimen>
</resources>
我从这些 链接和链接中获得帮助。您也可以通过研究这些链接来获得帮助。这对我有很大帮助。希望这也对您有所帮助。谢谢....