Как отключить режим сдвига BottomNavigationView?

BottomNavigationView не показывает заголовок меню, если он неактивен.

Как отобразить заголовки всех элементов меню в bottomNavigationBar? Проблема в том, что в моем случае отображается только заголовок элемента, по которому щелкнули.

введите здесь описание изображения


person Natan Rubinstein    schedule 21.10.2016    source источник
comment
Возможный дубликат новой нижней панели навигации Android   -  person Radhey    schedule 21.10.2016
comment
Вот полезный ответ, если вы хотите полностью удалить любую анимацию: stackoverflow.com/a/51052247/2352699 < / а>   -  person Fred Porciúncula    schedule 27.06.2018


Ответы (21)


Реализация BottomNavigationView имеет условие: когда элементов больше 3, используйте режим сдвига.

В настоящий момент вы не можете изменить его через существующий 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.

ОБНОВЛЕНИЕ

Вам также необходимо обновить файл конфигурации proguard (например, proguard-rules.pro), приведенный выше код использует отражение и не будет работать, если proguard запутает поле mShiftingMode.

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

Спасибо Мухаммаду Альфаифи за указание этой проблемы и предоставление фрагмента.

ОБНОВЛЕНИЕ 2

Как указала Джоланда Верхоф, новая библиотека поддержки (28.0.0-alpha1), а также новая библиотека компонентов материалов (1.0.0-beta01) предлагает общедоступное свойство, которое можно использовать для управления режимом переключения по трем пунктам меню.

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

В библиотеке компонентов материала это также применимо, если есть 5 пунктов меню.

ОБНОВЛЕНИЕ 3

Как также указал @ThomasSunderland, вы можете установить для этого свойства значение false app:itemHorizontalTranslation="false" без постфикса Enabled, чтобы отключить анимацию смещения.

вы можете ознакомиться с полным руководством по стилизации BottomNavigation здесь

person Przemysław Piechota. kibao    schedule 22.10.2016
comment
**** Proguard :( - person Muhammad Alfaifi; 28.12.2016
comment
Поле будет запутано, поэтому его значение будет невозможно изменить, если вы не исключите его из файла proguard-rules. - person Muhammad Alfaifi; 28.12.2016
comment
Хороший улов! Позже я дополню ответ образцом конфигурации proguard. - person Przemysław Piechota. kibao; 28.12.2016
comment
-keepclassmembers класс android.support.design.internal.BottomNavigationMenuView {логический mShiftingMode; } - person Muhammad Alfaifi; 28.12.2016
comment
Просто дополняя этот ответ, поскольку у меня были некоторые сомнения в первом впечатлении: вы можете заменить Timber на Log (довольно очевидно), а proguard - это файл с именем proguard-rules.pro, в который вам просто нужно добавить код ниже update. Синхронизируйте build.gradle, и все готово. Спасибо @ PrzemysławPiechota.kibao и MuhammadAlfaifi - person Victor R. Oliveira; 29.12.2016
comment
Большое спасибо! Такое компактное решение. - person Amit Garg; 17.02.2017
comment
Иногда мне действительно интересно, почему Google заставляет разработчиков просматривать реализации. Хотя в самом приложении Google+ есть 4 варианта, эта простая функция должна была быть доступна через простую функцию, если она доступна! Похожая проблема была с TabLayout, которая была исправлена ​​много позже в библиотеке поддержки. Спасибо за обходной путь Original Replier и @MuhammadAlfaifi за его улучшение. - person sud007; 12.05.2017
comment
работает отлично !! Я бы хотел, чтобы BottomNavigationView имел возможность переключать его без необходимости отражения - person Shujito; 09.07.2017
comment
Лучшее решение. Библиотека поддержки Android должна реализовать это - person KK_07k11A0585; 18.10.2017
comment
Надеюсь, Google скоро выпустит эта версия BottomNavigationView, которая включает метод setShiftingMode как в xml, так и в java. - person MidasLefko; 22.10.2017
comment
Имейте в виду, что если вы быстро щелкаете по вкладкам, цвет шрифта или значка изменится. - person Oya; 07.11.2017
comment
Так круто. Большое спасибо! - person Lendl Leyba; 29.11.2017
comment
@MuhammadAlfaifi Отличный материал. Proguard вызывал проблему в сценарии обновления, которая была исправлена ​​правилами. - person Ashwini Kumar; 19.02.2018
comment
@ PrzemysławPiechota.kibao, он не будет работать на Android P, не так ли? developer.android.com/preview/ - person Yazazzello; 25.04.2018
comment
@Yazazzello Он должен работать на Android P, потому что BottomNavigationView из библиотеки поддержки, а не из Android SDK. Ограничения будут применяться к интерфейсам, не относящимся к SDK, из пакетов, перечисленных на странице developer.android.com/reference/packages. html - person Przemysław Piechota. kibao; 25.04.2018
comment
Новая библиотека поддержки (28.0.0-alpha1) поддерживает изменение этого поведения с помощью app: labelVisibilityMode = labeled - person Jolanda Verhoef; 01.05.2018
comment
Комментарий Джоланды Верхоф должен быть включен в ответ, поскольку Android P пометил это как частный API, и метод отражения больше не работает. - person peshkira; 08.06.2018
comment
Мне нужно было следовать, чтобы это сработало. val bottomNavigationView: BottomNavigationView = findViewById ‹BottomNavigationView› (R.id.navigation) BottomNavigationViewHelper.disableShiftMode (bottomNavigationView) - person diehard98; 23.06.2018
comment
Помимо Джоланды Верхоф, когда вы используете 5 иконок, смещение происходит снова. Но теперь есть метод setItemHorizontalTranslationEnabled. Если установить для этого параметра значение false, значки останутся на своих местах. - person KvdLingen; 04.07.2018
comment
Метод setItemHorizontalTranslationEnabled () может быть установлен в xml с помощью свойства app: itemHorizontalTranslationEnabled = false, если вы хотите отключить анимацию смещения. - person Thomas Sunderland; 31.07.2018
comment
Библиотека поддержки 28.0.0 изменила поведение переключения. Вы можете установить этот стиль в BottomNavigationView, если вам нужна нижняя панель навигации со старым поведением. style=@style/Widget.Design.BottomNavigationView - person Mikhail Sharin; 16.10.2018
comment
Я не могу отредактировать ваш ответ, но к вашему сведению: библиотеки 28.0.1-alpha1 не существует. Используйте 28.0.0-alpha1, чтобы использовать labelVisibilityMode. - person saltandpepper; 18.10.2018
comment
@ThomasSunderland, возможно, вы захотите изменить его на app:itemHorizontalTranslation="false" для 28.0.0-alpha1, чтобы вы также могли использовать app:labelVisibilityMode="labeled" в сочетании с конфигурацией proguard, чтобы сохранить имя переменной. Ссылки здесь: mikescamell .com / - person mochadwi; 31.03.2019

Начиная с библиотеки поддержки 28.0.0-alpha1:

<android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled" />
person Junbin Deng    schedule 03.07.2018
comment
Я использую эту версию библиотеки поддержки, но по-прежнему получаю сообщение об ошибке labelVisibilityMode not found. - person Sagar Maiyad; 05.09.2018
comment
Работает правильно. Не нужно размышлять. Благодаря тонну - person Bhupesh; 06.09.2018
comment
@Riser убедитесь, что вы используете app:, а не android: - person Carson Holzheimer; 25.03.2019

Чтобы отключить текстовую анимацию, вы также можете использовать это в своем файле sizes.xml:

<dimen name="design_bottom_navigation_active_text_size">12sp</dimen>

Вам также может потребоваться добавить это в свой манифест:

tools:override="true"
person Pafoid    schedule 03.03.2017
comment
не работает. Я считаю, что мне нужно было просто добавить это в /values/dimens.xml? - person Rohan Kandwal; 07.03.2017
comment
@RohanKandwal нужно добавить tools:override="true" - person Boy; 27.03.2017
comment
@ Мальчик Спасибо, попробую. - person Rohan Kandwal; 27.03.2017
comment
измените только размер текста. - person The Dude; 25.07.2017
comment
Мне просто нужно поместить это в мой файл sizes.xml: <dimen name="design_bottom_navigation_active_text_size" tools:ignore="PrivateResource">12sp</dimen> - person Fernando Barbosa; 16.09.2019

Теперь вы можете использовать app:labelVisibilityMode="[labeled, unlabeled, selected, auto]" в 28-alpha

  • labeled сохранит все ярлыки видимыми.
  • unlabeled будут отображать только значки.
  • selected будет отображать только ярлык для выбранного элемента и сдвигать элементы.
  • auto будет выбирать помеченные или выбранные в зависимости от количества имеющихся у вас элементов. помечены для 1-3 предметов и выбраны для 3+ предметов.
person Aidan Laing    schedule 04.05.2018
comment
спасибо Ланки! Это лучшее и самое простое решение для меня - person Gregriggins36; 05.07.2018
comment
Куда добавить эту строчку кода. Я пытался добавить, но ошибки не обнаружено. - person Abdulwahid; 06.07.2018
comment
@Abdulwahid, вы можете добавить это в xml нижней панели навигации, если у вас есть библиотека поддержки 28 или выше - person Aidan Laing; 07.07.2018
comment
@Lunkie спасибо, теперь ясно, когда библиотека поддержки 28 - person Abdulwahid; 07.07.2018

Ответ Пшемыслава в Котлине как функция расширения

@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()
person ElegyD    schedule 27.02.2018
comment
Работаем на котлине. почему нам нужно использовать эту аннотацию @SuppressLint (RestrictedApi), вы можете объяснить, пожалуйста? - person Ranjith Kumar; 18.08.2018

Чтобы отключить текстовую анимацию и уменьшить размер шрифта, используйте это в вашем файле sizes.xml:

<dimen name="design_bottom_navigation_text_size">10sp</dimen> 
<dimen name="design_bottom_navigation_active_text_size">10sp</dimen>
person Abhishek    schedule 10.09.2017
comment
Можно Navigate - ›File...design_bottom_navigation_item.xml видеть, что другого выхода нет. - person arekolek; 26.10.2017

Работает для меня

bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);

or

<android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled" />
person UgAr0FF    schedule 11.07.2018
comment
мой работал нормально до target = 27, но с target = 28 он сломался, текст больше не отображался. Но setLabelVisibilityMode помогает мне, теперь работает как шарм - person joke4me; 19.09.2018

ОБНОВИТЬ

в 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());
        }
    }
}
person Narek Hayrapetyan    schedule 10.10.2018
comment
вы можете использовать этот код ниже. @SuppressLint (RestrictedApi) fun removeShiftMode (view: BottomNavigationView) {val menuView = view.getChildAt (0) как BottomNavigationMenuView menuView.labelVisibilityMode = LabelVisibilityMode.LABEL_VISIBILITY_LABELED menuView. - person Deep P; 14.05.2019

Как указывали другие, начиная с библиотеки поддержки 28.0.0-alpha1, возможно:

<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />

или вы можете установить его программно.

Примечание: если вы обновляете более старую версию библиотеки поддержки, не забудьте поднять версию пакета SDK для компиляции. Проверить версии поддержки libraray можно здесь: Версии библиотеки поддержки

Однако вы все равно можете получить сообщение labelVisibilityMode not found при компиляции, если ваше приложение зависит от более старых версий библиотеки поддержки дизайна. В этом случае попробуйте выполнить обновление до версии данной зависимости, которая зависит как минимум от версии 28.0.0-alpha1 библиотеки поддержки дизайна. Если это невозможно, определите зависимость явно.

Если вы используете Gradle

  1. Вы можете проверить свои зависимости, запустив задачу dependencies и поискав номер версии com.android.support:design.
  2. Чтобы явно добавить зависимость поддержки дизайна в ваш build.gradle:

    реализация 'com.android.support:design:28.0.0'

person Richárd Bogdán    schedule 23.09.2018

Для обновленного ответа используется значение по умолчанию. Обновите последнюю версию библиотеки дизайна

реализация "com.android.support:design:28.0.0"

и поместите в свои атрибуты BottomNavigationView xml

app:itemHorizontalTranslationEnabled="false"

можно поставить так же программно

bottomNavigationView.setItemHorizontalTranslationEnabled(false);

Вы можете найти источник здесь BottomNavigationView

Надеюсь, это тебе поможет.

person Lester L.    schedule 28.09.2018
comment
Чем это отличается от app:labelVisibilityMode? - person wonsuc; 25.03.2019
comment
@wonsuc - это анимация значка и текста, который анимирует выбранный элемент. В то время как labelVisibilityMode предназначен для отображения, хотите ли вы отображать значок с текстом или просто значок, который будет отображаться при выборе. - person Lester L.; 25.03.2019

В свой 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>

что приводит к следующему

Android в нижней части навигации: отключить текст и сдвиг

person All Іѕ Vаиітy    schedule 16.01.2019

Это очень просто, просто добавьте свойство в BottomNaviationView.

app:labelVisibilityMode="unlabeled"
person Nevil Ghelani    schedule 21.07.2019

У меня было странное поведение с BottomNavigationView. Когда я выбирал в нем какой-либо элемент / фрагмент, фрагмент толкает BottomNavigationView немного ниже, поэтому текст BottomNavigationView идет ниже экрана, поэтому видны только значки, а текст скрывается при нажатии любого элемента.

Если вы столкнулись с таким странным поведением, то вот решение. Просто удали

android:fitsSystemWindows="true"

в корневом макете фрагмента. Просто удали это и бум! BottomNavigationView будет работать нормально, теперь его можно отображать с текстом и значком. У меня это было в моем корневом CoordinatorLayout фрагмента.

Также не забудьте добавить

BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);

в вашей деятельности, чтобы отключить режим переключения. Хотя это не совсем связано с заданным вопросом, но все же я считаю это полезным.

person Kishan Solanki    schedule 21.11.2017
comment
@ abbath0767 видели ли вы эту ссылку? Может быть вам полезно. - person Kishan Solanki; 27.01.2018
comment
Я думал, что уже все перепробовал, большое спасибо, не ожидал, что прямо найду ответ, который искал. - person BekaBot; 26.03.2018
comment
Удовольствие @BekaBot - person Kishan Solanki; 27.03.2018

Это сторонняя библиотека, которую я использую, и в ней есть множество параметров настройки, таких как отключение режима сдвига, отображение только значков, установка размера значков и т. Д. BottomNavigationViewEx

person Pei    schedule 29.11.2017

Чтобы полностью удалить анимацию:

Если вы также хотите избавиться от этой раздражающей маленькой анимации верхнего поля, вам нужно больше кода отражения. Вот полное решение, которое удаляет любую анимацию:

@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;
}
person Fred Porciúncula    schedule 26.06.2018
comment
Android 9 (уровень API 28) вводит новые ограничения на использование интерфейсов, отличных от SDK, и это не сработает при таргетинге на 28. developer.android.com/about/versions/pie/ - person ernestkamara; 02.10.2018

обновите вашу библиотеку поддержки до 28.0.0.

bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
person M Moersalin    schedule 11.10.2018

Если вы используете support: design: 28.0.0, добавьте эту строку app: labelVisibilityMode = "unlabeled" в свой BottomNavigationView.

person Omar Hassan    schedule 21.11.2018

просто хочу добавить, что выше этого метода disableShiftMode также добавляет код ниже. @SuppressLint ("RestrictedApi")

person Aleesha Kanwal    schedule 14.06.2018

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>

person kreker    schedule 15.12.2019

Я использую Android Studio 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. Это мой код для 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();
    }
}
person Milo Chen    schedule 24.09.2020

Вы можете использовать это для отображения текста и значков в 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>

Мне помогли эти ссылка и ссылка. Вы также можете получить помощь, изучив эти ссылки. Это поможет мне Надеюсь, это тоже поможет вам. Спасибо....

person Rahul Kushwaha    schedule 23.03.2019