web-dev-qa-db-fra.com

BottomNavigationView affiche les icônes et les étiquettes de texte à tout moment

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?.

42

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"

98
shaishgandhi

MISE À JOUR À PARTIR 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

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

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

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()
10
chetbox

Voulez-vous cet effet? 

Click here to view the image

Si oui, je vous ai recommandé d'essayer BottomNavigationViewEx

9
ittianyu

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);
        }
5
wei wang

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)
    }
}
4
Harry Zhang

Alternative à BottomNavigationViewEx: BottomBar

1
Mateusz Budzisz

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"/>
0
Kumar Ajay A.K

essayez ceci, a travaillé pour moi

app:labelVisibilityMode="labeled"
0
saigopi