176 votes

Le BottomNavigationView affiche à la fois les icônes et les étiquettes de texte à tout moment.

J'utilise Android.support.design.widget.BottomNavigationView de 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, il affiche à la fois les icônes et les étiquettes de texte à tout moment.

Quelle est la façon d'afficher à la fois les icônes et les étiquettes de texte à tout moment lorsqu'il y a plus de trois actions ?

0 votes

Dans votre menu bottom_navigation_main.xml, si vous avez Android:showAsAction="ifRoom" changez-le en Android:showAsAction="always" pour chaque élément.

0 votes

Non, ça n'a pas marché. J'avais déjà essayé.

0 votes

Pouvez-vous montrer votre fichier xml de menu

454voto

shaishgandhi Points 1177

Pour tous ceux qui cherchent encore une solution et qui ne veulent pas dépendre de bibliothèques tierces ou de la réflexion du temps d'exécution, le BottomNavigationView de la bibliothèque de support 28/Jetpack prend en charge de manière native le fait de toujours avoir une étiquette de texte.

Ce site est la méthode que vous recherchez.

Ou en XML, app:labelVisibilityMode="labeled"

0 votes

De quelle version de la bibliothèque ai-je besoin ?

0 votes

Bibliothèque de support 28-alpha1+

0 votes

Vous pouvez également changer le mode de visibilité en "auto" afin d'afficher l'icône-texte uniquement lorsque vous appuyez dessus ou que vous vous concentrez. Code : app:labelVisibilityMode="auto"

81voto

KishanSolanki124 Points 966

MISE À JOUR du 8 mai 2018

Vous pouvez utiliser app:labelVisibilityMode="labeled" directement dans <android.support.design.widget.BottomNavigationView />

Source : https://developer.Android.com/reference/com/google/Android/material/bottomnavigation/LabelVisibilityMode

Pas besoin de cette longue solution ci-dessous.

RÉPONSE PRÉCÉDENTE

J'ai eu un comportement bizarre avec le BottomNavigationView. Lorsque je sélectionnais un élément/fragment, le fragment poussait la BottomNavigationView un peu plus bas, de sorte que le texte de la BottomNavigationView descendait en dessous de l'écran, de sorte que seules les icônes étaient visibles et que le texte était masqué lorsque je cliquais sur un élément.

Si vous êtes confronté à ce comportement étrange, voici la solution. Il suffit de supprimer

android:fitsSystemWindows="true"

dans votre disposition racine du fragment. Il suffit de le supprimer et boum ! BottomNavigationView fonctionnera bien, maintenant il peut être montré avec du texte et une icône. J'avais ceci dans mon Root CoordinatorLayout du fragment.

N'oubliez pas non plus d'ajouter

BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);

dans votre activité pour désactiver le mode 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");
        }
    }
}

0 votes

Ceci, combiné à la réponse de STAR_ZERO, a résolu mon problème !

0 votes

Dans l'appel, vous avez disableShiftMode et dans la classe removeShiftMode . A part cette petite différence, votre réponse a résolu le problème pour moi. J'ai maintenant cinq menuitems sans décalage et avec texte+icône. Je vous remercie. muy beaucoup !

0 votes

Parfait. Lorsque vous avez plus de 3 éléments dans votre navigation inférieure, un mode de décalage apparaît. En utilisant ceci, vous pouvez désactiver ce décalage et ainsi toutes les icônes avec du texte apparaissent en même temps.

19voto

STAR_ZERO Points 554

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

0 votes

Dans Android Studio, il faut ajouter du code comme ceci : ``` //noinspection RestrictedApi itemView.setShiftingMode(false) ; //noinspection RestrictedApi itemView.setChecked(false) ; ```

4 votes

Il s'agit toujours de postes de travail

1 votes

Parfait ! ! affiche à la fois l'icône et le texte. Mais le mode décalage (faux) ne fonctionne pas.

11voto

chetbox Points 216

Voici une fonction d'extension Kotlin qui combine la solution de @STAR_ZERO et celle de @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()

10voto

ittianyu Points 389

Voulez-vous cet effet ?

Click here to view the image

Si c'est le cas, je vous recommande d'essayer BottomNavigationViewEx

1 votes

Votre bibliothèque est bonne et impressionnante, mais je cherchais à réaliser cette fonctionnalité en utilisant la bibliothèque de conception 25.0.0. Malheureusement, cela va à l'encontre des pratiques de conception d'Android.

0 votes

Cela ne va pas à l'encontre des spécifications du Material Design, selon la rubrique "Barre de navigation inférieure fixe" de la section les docs . Je vous remercie également d'avoir partagé cette formidable bibliothèque.

1 votes

C'est contraire aux spécifications de Material Design. Si vous lisez le document que vous avez fourni, vous verrez qu'il est explicitement indiqué "S'il y a quatre ou cinq actions, afficher les vues inactives sous forme d'icônes uniquement".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X