2016-10-21 8 views
73

BottomNavigationView не показывает название меню, которое неактивно.Как отключить режим сдвига BottomNavigationView?

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

enter image description here

+1

Возможный дубликат [Android новой Bottom навигации bar] (http://stackoverflow.com/questions/36032177/android-new-bottom-navigation-bar) – Radhey

ответ

189

Реализация 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.

UPDATE

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

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

Благодаря Мухаммад Alfaifi для указания this issue и providing snippet.

+6

**** Proguard :( –

+0

Что случилось с Proguard? –

+13

Поле будет запутано, поэтому не будет никакого способа изменить его значение, если вы не исключите его в файл правил proguard- –

13

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

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

не работает. Я считаю, что мне нужно просто добавить это в /values/dimens.xml? –

+6

@RohanKandwal необходимо добавить 'tools: override =" true "' – Boy

+0

@Boy Спасибо, попробуем. –

4

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

<dimen name="design_bottom_navigation_text_size">10sp</dimen> 
<dimen name="design_bottom_navigation_active_text_size">10sp</dimen> 
+0

Можно «Навигация» -> «Файл ...»> «design_bottom_navigation_item.xml», чтобы увидеть, что другого пути нет. – arekolek

1

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

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

android:fitsSystemWindows="true" 

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

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

BottomNavigationViewHelper.disableShiftMode(bottomNavigationView); 

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

+0

не работает для меня – abbath0767

+1

@ abbath0767 Вы видели [link] (https://stackoverflow.com/a/47407229/8874958) это? Может быть полезно для вас. – KishanSolanki124

+0

да, эта помощь для меня ... странная. Очень thx! – abbath0767

1

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

1

ответ Przemyslaw в Котлине в качестве функции расширения

@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) 
    } 
} 

Использование (с Котлин Android Extensions):

bottom_navigation_view.disableShiftMode() 

 Смежные вопросы

  • Нет связанных вопросов^_^