BottomNavigationView with more than 3 Items: tab title is hiding
The solution using reflection doesn't work anymore because the field mShiftingMode was removed.
There's an easy way to do it now:
Use Support Library 28 or higher and just add app:labelVisibilityMode="labeled"
to your BottomNavigationView
XML declaration.
Hope it helps.
UPDATE
removeShiftMode() is no longer needed, as in support library 28.0.0-alpha1 we can now add Labels.
In XML:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
For programmatically change:
mBottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
For this to work: update the design support library to 28.0.0-alpha1
Here is a Good read
FOR OLDER SUPPORT LIBRARY:
in your bottom_bar_menu.xml
.Change the showAsAction
attribute
<item android:id="@id/menu_item"
android:title="text"
android:icon="@drawable/drawable_resource_name"
android:showAsAction="always|withText" />
in build.gradle:
compile 'com.android.support:design:25.3.1'
BOTTOM NAVIGATIONVIEW MORE THAN 3 ITEMS: use removeShiftMode()
method
in BottomNavigationViewHelper.java
Use:
import android.annotation.SuppressLint;
import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import java.lang.reflect.Field;
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);
//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("BottomNav", "Unable to get shift mode field", e);
} catch (IllegalAccessException e) {
Log.e("BottomNav", "Unable to change value of shift mode", e);
}
}
}
Call it using:
BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_navigation);
BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);
It will disable the shift animation of the title text and enable the text to be displayed.
After scan source code of BottomNavigationView I find
mShiftingMode = mMenu.size() > 3;
in BottomNavigationMenuView.java line 265, it means while menu size more than 3, tab title wiil be hid. So if you want to show tab title you just need to get code from build and change to below.
mShiftingMode = mMenu.size() > 5;
PS: BottonNavigationView max tab count must between 3 and 5. You can get code on BottomNavigationViewNew