BottomNavigationView не показывает заголовок меню, если он неактивен.
Как отобразить заголовки всех элементов меню в bottomNavigationBar? Проблема в том, что в моем случае отображается только заголовок элемента, по которому щелкнули.
BottomNavigationView не показывает заголовок меню, если он неактивен.
Как отобразить заголовки всех элементов меню в bottomNavigationBar? Проблема в том, что в моем случае отображается только заголовок элемента, по которому щелкнули.
Реализация 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 здесь
BottomNavigationView
имел возможность переключать его без необходимости отражения
- person Shujito; 09.07.2017
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" />
app:
, а не android:
- person Carson Holzheimer; 25.03.2019
Чтобы отключить текстовую анимацию, вы также можете использовать это в своем файле sizes.xml:
<dimen name="design_bottom_navigation_active_text_size">12sp</dimen>
Вам также может потребоваться добавить это в свой манифест:
tools:override="true"
tools:override="true"
- person Boy; 27.03.2017
<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+ предметов.Ответ Пшемыслава в Котлине как функция расширения
@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()
Чтобы отключить текстовую анимацию и уменьшить размер шрифта, используйте это в вашем файле sizes.xml:
<dimen name="design_bottom_navigation_text_size">10sp</dimen>
<dimen name="design_bottom_navigation_active_text_size">10sp</dimen>
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" />
ОБНОВИТЬ
в 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
?
- person wonsuc; 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>
что приводит к следующему
Это очень просто, просто добавьте свойство в 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;
}
обновите вашу библиотеку поддержки до 28.0.0.
bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
Если вы используете support: design: 28.0.0, добавьте эту строку app: labelVisibilityMode = "unlabeled" в свой BottomNavigationView.
просто хочу добавить, что выше этого метода disableShiftMode также добавляет код ниже. @SuppressLint ("RestrictedApi")
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>
Я использую 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();
}
}
Вы можете использовать это для отображения текста и значков в 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>
Мне помогли эти ссылка и ссылка. Вы также можете получить помощь, изучив эти ссылки. Это поможет мне Надеюсь, это тоже поможет вам. Спасибо....