BottomNavigationView始终显示图标和文本标签

我从设计支持库版本25使用android.support.design.widget.BottomNavigationView

compile 'com.android.support:design:25.0.0'  

当在@ menu / bottom_navigation_main中只有三个动作时,它总是显示图标和文本标签。

当有三个以上的动作时,一直显示图标和文字标签的方法是什么?

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

在BottomNavigationView类中有一个BottomNavigationMenuView字段,在BottomNavigationMenuView中有一个BottomNavigationItemView []字段,它是底部栏中的项目。

说n是项目的数量,BottomNavigationMenuView将调用BottomNavigationItemView []数组的每个成员BottomNavigationItemView.setShiftingMode(n> 3)。 此function决定行为(总是显示标题或仅在选择时显示标题)。

所以总是显示标题的方法是尝试调用此方法,并且可以使用reflection来访问专用字段。

  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 

你想要这个效果吗?

点击这里查看图像

如果是这样,我建议你尝试BottomNavigationViewEx 。

我有一些与BottomNavigationView怪异的行为。 当我在其中选择任何项目/片段时,片段将BottomNavigationView降低一些,因此BottomNavigationView的文本会在屏幕下方显示,因此只有图标可见,并且在单击任何项​​目时文本都会隐藏。

如果你面对那种怪异的行为,那么这就是解决方案。 只要删除

 android:fitsSystemWindows="true" 

在你的根布局的片段。 只要删除这个和繁荣! BottomNavigationView将正常工作,现在可以显示文本和图标。 我有我的根本CoordinatorLayout片段。

另外不要忘记添加

 BottomNavigationViewHelper.disableShiftMode(bottomNavigationView); 

在您的活动禁用移位模式。

这是这个class级:

 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"); } } 

}

一路显示标题。 试试这个Kotlin代码:

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

BottomNavigationViewEx替代BottomBar