BottomNavigationView отображает как значки, так и текстовые метки во все времена
Я использую android.support.design.widget.BottomNavigationView из библиотеки поддержки дизайна версии 25
compile 'com.android.support:design:25.0.0'
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottomBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_gravity="center"
app:itemBackground="@color/colorPrimary"
app:menu="@menu/bottom_navigation_main"
android:forceHasOverlappingRendering="true"/>
Когда в @menu/bottom_navigation_main есть только три действия, он всегда отображает значки и текстовые метки.
Каким образом можно отображать как значки, так и текстовые метки во все время, когда существует более трех действий.
Ответы
Ответ 1
Для тех, кто все еще ищет решение и не хочет полагаться на сторонние библиотеки или анализ среды выполнения, BottomNavigationView в библиотеке поддержки 28/Jetpack изначально поддерживает постоянное наличие текстовой метки.
Это метод, который вы ищете.
Или в XML app:labelVisibilityMode="labeled"
Ответ 2
ОБНОВЛЕНИЕ С 8 мая 2018 года
Вы можете использовать app:labelVisibilityMode="labeled"
непосредственно в <android.support.design.widget.BottomNavigationView/>
Источник: https://developer.android.com/reference/com/google/android/material/bottomnavigation/LabelVisibilityMode
Не нужно это ниже длинное решение.
ПРЕДЫДУЩИЙ ОТВЕТ
У меня было странное поведение с BottomNavigationView. Когда я выбирал какой-либо элемент/фрагмент в нем, фрагмент толкает BottomNavigationView чуть ниже, поэтому текст BottomNavigationView идет ниже экрана, поэтому видны только значки, а текст скрывается при нажатии любого элемента.
Если вы столкнулись с таким странным поведением, то вот решение. Просто удали
android:fitsSystemWindows="true"
в вашем корневом макете фрагмента. Просто уберите это и бум! BottomNavigationView будет работать нормально, теперь он может быть показан с текстом и значком. У меня было это в моем корне CoordinatorLayout фрагмента.
Также не забудьте добавить
BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);
в вашей активности, чтобы отключить режим переключения.
Вот этот класс:
public class BottomNavigationViewHelper {
@SuppressLint("RestrictedApi")
public static void removeShiftMode(BottomNavigationView view) {
//this will remove shift mode for bottom navigation 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);
// set once again checked value, so view will be updated
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
Log.e("ERROR NO SUCH FIELD", "Unable to get shift mode field");
} catch (IllegalAccessException e) {
Log.e("ERROR ILLEGAL ALG", "Unable to change value of shift mode");
}
}
}
Ответ 3
Это сложно в версии 25.
Попробуйте этот код. Но я думаю, что это нехорошее решение.
BottomNavigationView navigationView = (BottomNavigationView) findViewById(R.id.bottomBar);
BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigationView.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView itemView = (BottomNavigationItemView) menuView.getChildAt(i);
itemView.setShiftingMode(false);
itemView.setChecked(false);
}
Ответ 4
Здесь функция расширения Kotlin, которая объединяет решение @STAR_ZERO и @KishanSolanki124.
fun BottomNavigationView.disableShiftMode() {
val menuView = getChildAt(0) as BottomNavigationMenuView
menuView.javaClass.getDeclaredField("mShiftingMode").apply {
isAccessible = true
setBoolean(menuView, false)
isAccessible = false
}
@SuppressLint("RestrictedApi")
for (i in 0 until menuView.childCount) {
(menuView.getChildAt(i) as BottomNavigationItemView).apply {
setShiftingMode(false)
setChecked(false)
}
}
}
Чтобы использовать это:
myBottomNavigation.disableShiftMode()
Ответ 5
Вы хотите этого эффекта?
![Click here to view the image]()
![]()
Если это так, я рекомендовал вам попробовать BottomNavigationViewEx 。
Ответ 6
в классе BottomNavigationView есть поле BottomNavigationMenuView, а в BottomNavigationMenuView есть поле BottomNavigationItemView [], которое является элементами в нижней панели.
Скажем n - количество элементов, BottomNavigationMenuView будет вызывать метод BottomNavigationItemView.setShiftingMode(n > 3) для каждого члена массива BottomNavigationItemView []. Эта функция определяет поведение (показать заголовок всегда или только при выборе).
поэтому способ всегда показывать заголовки - это попытаться вызвать этот метод, и вы можете использовать отражение для доступа к закрытым полям.
BottomNavigationView bottomNavigationView= (BottomNavigationView) findViewById(R.id.bottom_navigation);
// get the private BottomNavigationMenuView field
Field f = null;
try {
f = bottomNavigationView.getClass().getDeclaredField("mMenuView");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
f.setAccessible(true);
BottomNavigationMenuView menuView=null;
try {
menuView = (BottomNavigationMenuView) f.get(bottomNavigationView);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// get the private BottomNavigationItemView[] field
try {
f=menuView.getClass().getDeclaredField("mButtons");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
f.setAccessible(true);
BottomNavigationItemView[] mButtons=null;
try {
mButtons = (BottomNavigationItemView[]) f.get(menuView);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
for(int i=0;i<mButtons.length;i++){
mButtons[i].setShiftingMode(false);
mButtons[i].setChecked(true);
}
Ответ 7
Чтобы показать названия полностью. Попробуйте этот код Котлина:
@SuppressLint("RestrictedApi")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_ofree)
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
val menuView = navigation.getChildAt(0) as BottomNavigationMenuView
for (i in 0 until menuView.childCount) {
val itemView = menuView.getChildAt(i) as BottomNavigationItemView
itemView.setShiftingMode(false)
itemView.setChecked(false)
}
}
Ответ 8
Альтернатива BottomNavigationViewEx:
BottomBar
Ответ 9
попробуй это, у меня сработало
app:labelVisibilityMode="labeled"
Ответ 10
Вы можете использовать это для отображения текста и значков в BottomNevigationView
app:labelVisibilityMode="labeled"
Если вы используете это, вы сможете просматривать как значок, так и текст
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/bottom_navigation_view"
android:layout_alignParentBottom="true"
app:menu="@menu/bottom_navigation_menu"/>
Ответ 11
Вы можете использовать это для отображения текста и значков в 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>
Я получил помощь по этой ссылке и ссылке. Вы также можете получить помощь, изучив эти ссылки. Это мне очень помогает. Надеюсь, это также поможет вам. Спасибо....