14

Я использую android.support.design.widget.BottomNavigationView от поддержки проектирования версии библиотеки 25BottomNavigationView отображать как значки и текстовые метки во все времена

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"/> 

Когда есть только три действия в @ меню/bottom_navigation_main, он отображает как значки, так и текстовые метки во все времена.

Каким образом можно отображать как значки, так и текстовые метки во все время, когда существует более трех действий.

+0

В меню bottom_navigation_main.xml, если у вас есть андроид: showAsAction = "ifRoom" изменить его на Android: showAsAction = "всегда" для каждого элемента. –

+0

Нет, это не сработало. Я уже пробовал это. –

+0

Можете ли вы показать свое xml-файл меню –

ответ

4

В классе 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); 
     } 
+0

Это очень хорошо, просто нужно убедиться, что BottomNavigationMenuView также не сдвигается. -> f = menuView.getClass(). GetDeclaredField ("mShiftingMode"); \t \t \t f.setAccessible (true); f.setBoolean (menuView, false); –

13

трудно в версии 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); 
} 
+0

В Android Studio следует добавить такой код: '' ' // noinspection RestrictedApi itemView.setShiftingMode (false); // noinspection RestrictedApi itemView.setChecked (false); '' ' –

+3

все еще сменяет товары – CodeToLife

+1

Perfect !! отображает как значок, так и текст. Но режим переключения (false) не работает. – Minkoo

4

Вы хотите этого эффекта?

Click here to view the image

Если да, то я рекомендовал вам попробовать BottomNavigationViewEx

+1

В вашей библиотеке хорошая и впечатляющая работа Но я искал эту функциональность, используя библиотеку дизайна 25.0.0 К сожалению, это противоречит практике проектирования Android –

+1

https://material.google.com/components/bottom-navigation.html –

+0

Это не касается спецификаций материалов, в соответствии с «Фиксированной нижней навигационной панелью» в [документах] (https://material.io/guidelines/components/bottom-navigation.html). Кроме того, моя личная благодарность за то, что вы поделились этой замечательной библиотекой. –

3

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

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

android:fitsSystemWindows="true" 

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

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

BottomNavigationViewHelper.disableShiftMode(bottomNavigationView); 

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

Вот что класс:

public class BottomNavigationViewHelper { 

@SuppressLint("RestrictedApi") 
public static void removeShiftMode(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); 
      // 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"); 
    } 
} 

}

+0

Это в сочетании с ответом STAR_ZERO решило мою проблему! –

2

Чтобы показать Титулы весь путь. Попробуйте этот Котлин код:

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

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

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