如何禁用 BottomNavigationView 切换模式?
How to disable BottomNavigationView shift mode?
BottomNavigationView 不显示未激活的菜单标题。
如何在bottomNavigationBar中显示所有菜单元素的标题?
问题是在我的例子中只显示了被点击元素的标题。
BottomNavigationView
的实现有条件:当项目超过3个时使用shift模式。
此时您无法通过现有的 API 更改它,禁用 shift 模式的唯一方法是使用反射。
你需要帮手 class:
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
方法,但请记住,如果您从代码中扩充菜单视图,则必须在扩充后执行它。
用法示例:
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 指点 and 。
更新 2
正如 Jolanda Verhoef 指出的那样,新的支持库 (28.0.0-alpha1
) 以及新的 Material Components library (1.0.0-beta01
) 提供了 public 属性可用于在 3 个菜单项上操纵换档模式。
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"
...
/>
在 Material 组件库中,如果有 5 个菜单项,它也适用。
更新 3
正如@ThomasSunderland 也指出的那样,您可以将此 属性 设置为 false app:itemHorizontalTranslation="false"
而无需 Enabled
后缀来禁用移动动画。
您可以查看完整的 BottomNavigation 样式指南 here
要禁用文本动画,您还可以在 dimens.xml 文件中使用它:
<dimen name="design_bottom_navigation_active_text_size">12sp</dimen>
您可能还需要将此添加到您的清单中:
tools:override="true"
要禁用文本动画并减小字体大小,请在您的 dimens.xml 文件中使用:
<dimen name="design_bottom_navigation_text_size">10sp</dimen>
<dimen name="design_bottom_navigation_active_text_size">10sp</dimen>
我对 BottomNavigationView 有一些奇怪的行为。当我在其中选择任何 item/fragment 时,片段将 BottomNavigationView 推低一点,因此 BottomNavigationView 的文本位于屏幕下方,因此只有图标可见,点击任何项目时文本隐藏。
如果您遇到这种奇怪的行为,那么这里是解决方案。
只需删除
android:fitsSystemWindows="true"
在片段的根布局中。只需删除它和繁荣! BottomNavigationView 可以正常工作,现在它可以显示文本和图标。
我在 fragment 的根 CoordinatorLayout 中有这个。
另外别忘了加
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
在您的 activity 中禁用换档模式。
虽然它与提出的问题并不完全相关,但我仍然觉得这很有帮助。
这是我使用的第三方库,它有许多自定义选项,例如禁用 shift 模式、仅显示图标、设置图标大小等。
BottomNavigationViewEx
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()
您现在可以在 28-alpha
中使用 app:labelVisibilityMode="[labeled, unlabeled, selected, auto]"
labeled
将使所有标签可见。
unlabeled
将只显示图标。
selected
将只显示所选项目和转移项目的标签。
auto
将根据您拥有的物品数量选择标记或选择。标记了 1-3 项并选择了 3 项以上。
只想在此方法 disableShiftMode 上方添加以下代码。
@SuppressLint("RestrictedApi")
要完全删除动画:
如果您还想摆脱烦人的小上边距动画,则需要更多反射代码。这是删除任何动画的完整解决方案:
@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");
}
}
并确保将其添加到您的混淆器配置文件中:
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
-keepclassmembers class android.support.design.internal.BottomNavigationItemView {
int mShiftAmount;
}
因为支持库 28.0.0-alpha1:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
适合我
bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
或
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
正如其他人指出的那样,由于 支持库 28.0.0-alpha1 因此有可能:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
或者您可以设置它 programatically。
注意:如果您是从旧版本的支持库升级,请不要忘记提高编译SDK版本。
在此处检查支持库的版本:Support Library versions
但是,如果您的应用程序依赖于旧版本的设计支持库,您在编译时可能仍会收到 labelVisibilityMode not found 消息。如果是这种情况,请尝试升级到给定依赖项的版本,该版本至少依赖于设计支持库的 28.0.0-alpha1 版本。如果那不可能,请明确定义依赖关系。
如果你使用Gradle
- 您可以通过以下方式检查您的依赖关系
运行 dependencies 任务并搜索 com.android.support:design.
的版本号
要在 build.gradle 中明确添加设计支持依赖项:
实施'com.android.support:design:28.0.0'
使用默认值更新答案。更新到最新的设计库
implementation "com.android.support:design:28.0.0"
并放入您的 BottomNavigationView xml 属性
app:itemHorizontalTranslationEnabled="false"
您也可以通过编程方式将其放置
bottomNavigationView.setItemHorizontalTranslationEnabled(false);
您可以在此处找到源代码BottomNavigationView
希望对您有所帮助。
更新
在 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。
bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
如果您使用的是 support:design:28.0.0,请将此行 app:labelVisibilityMode="unlabeled" 添加到您的 BottomNavigationView
在您的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>
结果如下
您可以使用它在 BottomNevigationView 上同时显示 3 到 5 个项目的文本和图标并停止移动。
app:labelVisibilityMode="labeled"
但是你会遇到BottmNevigationView 5 item的长文本切割问题。为此,我找到了一个很好的解决方案来停止移动文本以及 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.Add 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>
我得到了这些link and link的帮助。你也可以通过学习这些得到帮助links.This对我有帮助lot.Hope这对你也有帮助。谢谢....
很简单,在BottomNavigationView
中添加一个属性即可
app:labelVisibilityMode="unlabeled"
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>
我使用AndroidStudio 4.0.1开发。
以下是我的结果...
关于BottomNavigationViewHelper.java
我的代码在这里工作
import com.google.android.material.bottomnavigation.BottomNavigationItemView;
import com.google.android.material.bottomnavigation.BottomNavigationMenuView;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.bottomnavigation.LabelVisibilityMode;
import android.annotation.SuppressLint;
import android.util.Log;
import java.lang.reflect.Field;
public class BottomNavigationViewHelper {
@SuppressLint("RestrictedApi")
public static void disableShiftMode(BottomNavigationView view) {
view.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
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.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());
}
} 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);
}
}
}
然后我们就可以开始使用BottomNavigationViewHelper了class
这是我的 MainActivity.java.
代码
BottomNavigationView navView = findViewById(R.id.nav_view);
BottomNavigationViewHelper.disableShiftMode(navView);
import android.os.Bundle;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navView = findViewById(R.id.nav_view);
BottomNavigationViewHelper.disableShiftMode(navView);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
R.id.navigation_settings,
R.id.navigation_connection,
R.id.navigation_status,
R.id.navigation_report,
R.id.navigation_profile
).build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(navView, navController);
getSupportActionBar().hide();
}
}
BottomNavigationView 不显示未激活的菜单标题。
如何在bottomNavigationBar中显示所有菜单元素的标题? 问题是在我的例子中只显示了被点击元素的标题。
BottomNavigationView
的实现有条件:当项目超过3个时使用shift模式。
此时您无法通过现有的 API 更改它,禁用 shift 模式的唯一方法是使用反射。
你需要帮手 class:
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
方法,但请记住,如果您从代码中扩充菜单视图,则必须在扩充后执行它。
用法示例:
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
) 以及新的 Material Components library (1.0.0-beta01
) 提供了 public 属性可用于在 3 个菜单项上操纵换档模式。
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"
...
/>
在 Material 组件库中,如果有 5 个菜单项,它也适用。
更新 3
正如@ThomasSunderland 也指出的那样,您可以将此 属性 设置为 false app:itemHorizontalTranslation="false"
而无需 Enabled
后缀来禁用移动动画。
您可以查看完整的 BottomNavigation 样式指南 here
要禁用文本动画,您还可以在 dimens.xml 文件中使用它:
<dimen name="design_bottom_navigation_active_text_size">12sp</dimen>
您可能还需要将此添加到您的清单中:
tools:override="true"
要禁用文本动画并减小字体大小,请在您的 dimens.xml 文件中使用:
<dimen name="design_bottom_navigation_text_size">10sp</dimen>
<dimen name="design_bottom_navigation_active_text_size">10sp</dimen>
我对 BottomNavigationView 有一些奇怪的行为。当我在其中选择任何 item/fragment 时,片段将 BottomNavigationView 推低一点,因此 BottomNavigationView 的文本位于屏幕下方,因此只有图标可见,点击任何项目时文本隐藏。
如果您遇到这种奇怪的行为,那么这里是解决方案。 只需删除
android:fitsSystemWindows="true"
在片段的根布局中。只需删除它和繁荣! BottomNavigationView 可以正常工作,现在它可以显示文本和图标。 我在 fragment 的根 CoordinatorLayout 中有这个。
另外别忘了加
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
在您的 activity 中禁用换档模式。 虽然它与提出的问题并不完全相关,但我仍然觉得这很有帮助。
这是我使用的第三方库,它有许多自定义选项,例如禁用 shift 模式、仅显示图标、设置图标大小等。 BottomNavigationViewEx
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()
您现在可以在 28-alpha
app:labelVisibilityMode="[labeled, unlabeled, selected, auto]"
labeled
将使所有标签可见。unlabeled
将只显示图标。selected
将只显示所选项目和转移项目的标签。auto
将根据您拥有的物品数量选择标记或选择。标记了 1-3 项并选择了 3 项以上。
只想在此方法 disableShiftMode 上方添加以下代码。 @SuppressLint("RestrictedApi")
要完全删除动画:
如果您还想摆脱烦人的小上边距动画,则需要更多反射代码。这是删除任何动画的完整解决方案:
@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");
}
}
并确保将其添加到您的混淆器配置文件中:
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
-keepclassmembers class android.support.design.internal.BottomNavigationItemView {
int mShiftAmount;
}
因为支持库 28.0.0-alpha1:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
适合我
bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
或
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
正如其他人指出的那样,由于 支持库 28.0.0-alpha1 因此有可能:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
或者您可以设置它 programatically。
注意:如果您是从旧版本的支持库升级,请不要忘记提高编译SDK版本。 在此处检查支持库的版本:Support Library versions
但是,如果您的应用程序依赖于旧版本的设计支持库,您在编译时可能仍会收到 labelVisibilityMode not found 消息。如果是这种情况,请尝试升级到给定依赖项的版本,该版本至少依赖于设计支持库的 28.0.0-alpha1 版本。如果那不可能,请明确定义依赖关系。
如果你使用Gradle
- 您可以通过以下方式检查您的依赖关系 运行 dependencies 任务并搜索 com.android.support:design. 的版本号
要在 build.gradle 中明确添加设计支持依赖项:
实施'com.android.support:design:28.0.0'
使用默认值更新答案。更新到最新的设计库
implementation "com.android.support:design:28.0.0"
并放入您的 BottomNavigationView xml 属性
app:itemHorizontalTranslationEnabled="false"
您也可以通过编程方式将其放置
bottomNavigationView.setItemHorizontalTranslationEnabled(false);
您可以在此处找到源代码BottomNavigationView
希望对您有所帮助。
更新
在 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。
bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
如果您使用的是 support:design:28.0.0,请将此行 app:labelVisibilityMode="unlabeled" 添加到您的 BottomNavigationView
在您的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>
结果如下
您可以使用它在 BottomNevigationView 上同时显示 3 到 5 个项目的文本和图标并停止移动。
app:labelVisibilityMode="labeled"
但是你会遇到BottmNevigationView 5 item的长文本切割问题。为此,我找到了一个很好的解决方案来停止移动文本以及 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.Add 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>
我得到了这些link and link的帮助。你也可以通过学习这些得到帮助links.This对我有帮助lot.Hope这对你也有帮助。谢谢....
很简单,在BottomNavigationView
中添加一个属性即可app:labelVisibilityMode="unlabeled"
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>
我使用AndroidStudio 4.0.1开发。
以下是我的结果...
关于BottomNavigationViewHelper.java 我的代码在这里工作
import com.google.android.material.bottomnavigation.BottomNavigationItemView;
import com.google.android.material.bottomnavigation.BottomNavigationMenuView;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.bottomnavigation.LabelVisibilityMode;
import android.annotation.SuppressLint;
import android.util.Log;
import java.lang.reflect.Field;
public class BottomNavigationViewHelper {
@SuppressLint("RestrictedApi")
public static void disableShiftMode(BottomNavigationView view) {
view.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
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.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());
}
} 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);
}
}
}
然后我们就可以开始使用BottomNavigationViewHelper了class 这是我的 MainActivity.java.
代码BottomNavigationView navView = findViewById(R.id.nav_view); BottomNavigationViewHelper.disableShiftMode(navView);
import android.os.Bundle;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navView = findViewById(R.id.nav_view);
BottomNavigationViewHelper.disableShiftMode(navView);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
R.id.navigation_settings,
R.id.navigation_connection,
R.id.navigation_status,
R.id.navigation_report,
R.id.navigation_profile
).build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(navView, navController);
getSupportActionBar().hide();
}
}