J'utilise Android.support.design.widget.BottomNavigationView depuis la bibliothèque de support de conception version 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"/>
Lorsqu'il n'y a que trois actions dans @ menu/bottom_navigation_main, les icônes et les étiquettes de texte sont affichées à tout moment.
Quel est le moyen d'afficher les icônes et les étiquettes de texte à tout moment lorsqu'il y a plus de trois actions?.
Pour ceux qui recherchent toujours une solution et ne veulent pas s’appuyer sur des bibliothèques tierces ou sur des réflexions d’exécution, BottomNavigationView dans Support Library 28/Jetpack prend en charge de manière native le fait d’avoir une étiquette de texte.
This est la méthode que vous recherchez.
Ou en XML, app:labelVisibilityMode="labeled"
MISE À JOUR À PARTIR DU 8 mai 2018
Vous pouvez utiliser app:labelVisibilityMode="labeled"
Directement dans <Android.support.design.widget.BottomNavigationView />
Ne pas besoin de cette solution ci-dessous longue.
RÉPONSE PRÉCÉDENTE
J'ai eu un comportement étrange avec BottomNavigationView. Lorsque je sélectionnais un élément ou un fragment de celui-ci, le fragment pousse BottomNavigationView un peu plus bas, donc le texte de BottomNavigationView passe en dessous de l'écran, de sorte que seules les icônes sont visibles et le texte caché en cliquant sur un élément.
Si vous êtes confronté à ce comportement étrange, voici la solution ..
Android:fitsSystemWindows="true"
dans votre disposition racine de fragment. Il suffit de retirer cela et boum! BottomNavigationView fonctionnera correctement, il peut maintenant être affiché avec un texte et une icône. J'ai cela dans ma racine CoordinatorLayout of fragment.
Aussi n'oubliez pas d'ajouter
BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);
dans votre activité pour désactiver le mode de décalage.
Voici cette classe:
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");
}
}
}
C'est difficile dans la version 25.
Essayez ce code. Mais je pense que ce n'est pas une bonne solution.
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);
}
Voici une fonction d'extension Kotlin qui combine les solutions @STAR_ZERO et @ 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)
}
}
}
Pour l'utiliser:
myBottomNavigation.disableShiftMode()
Voulez-vous cet effet?
Si oui, je vous ai recommandé d'essayer BottomNavigationViewEx 。
dans la classe BottomNavigationView, il existe un champ BottomNavigationMenuView et dans BottomNavigationMenuView, un champ BottomNavigationItemView [], qui représente les éléments de la barre inférieure.
Si n est le nombre d'éléments, BottomNavigationMenuView appellera BottomNavigationItemView.setShiftingMode (n> 3) sur chaque membre du tableau BottomNavigationItemView []. Cette fonction décide du comportement (afficher le titre toujours ou uniquement lors de la sélection).
la façon de toujours montrer les titres est d'essayer d'appeler cette méthode et vous pouvez utiliser la réflexion pour accéder aux champs privés.
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);
}
Montrer les titres jusqu'au bout. Essayez ce code 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)
}
}
Alternative à BottomNavigationViewEx: BottomBar
Vous pouvez l'utiliser pour afficher du texte et des icônes sur BottomNevigationView
app:labelVisibilityMode="labeled"
Si vous utilisez ceci, vous pourrez voir l’icône et le texte
<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"/>
essayez ceci, a travaillé pour moi
app:labelVisibilityMode="labeled"