148 votes

Comment désactiver le mode Shift BottomNavigationView?

BottomNavigationView n'affiche pas les titres de menus inactifs.

Comment afficher les titres de tous les éléments de menu dans bottomNavigationBar? Le problème est que dans mon cas, seul le titre de l'élément sur lequel vous avez cliqué est affiché.

entrez la description de l'image ici

333voto

La mise en œuvre de l' BottomNavigationView a condition: quand il n'y a plus de 3 éléments, puis utilisez shift mode.

En ce moment, vous ne pouvez pas le modifier via API existantes et la seule façon de désactiver le mode de décalage est d'utiliser la réflexion.

Vous aurez besoin de la classe helper:

import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import android.util.Log;
import java.lang.reflect.Field;

public class BottomNavigationViewHelper {
    public static void disableShiftMode(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("BNVHelper", "Unable to get shift mode field", e);
        } catch (IllegalAccessException e) {
            Log.e("BNVHelper", "Unable to change value of shift mode", e);
        }
    }
}

Puis appliquez disableShiftMode méthode sur votre BottomNavigationView, mais souvenez-vous si vous êtes gonflant d'affichage du menu à partir de votre code, vous devez l'exécuter après le gonflage.

Exemple d'utilisation:

BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);

PS.

Rappelez-vous, vous aurez besoin d'exécuter cette méthode chaque fois que vous modifiez des éléments de menu dans votre BottomNavigationView.

Mise à JOUR

Vous avez également besoin de mettre à jour proguard fichier de configuration (par exemple, proguard-règles.pro), le code ci-dessus utilise la réflexion et ne fonctionnera pas si proguard obscurcir l' mShiftingMode champ.

-keepclassmembers class android.support.design.internal.BottomNavigationMenuView { 
    boolean mShiftingMode; 
}

Grâce Muhammad Alfaifi pour pointer ce problème et de fournir l'extrait de code.

Mise à JOUR 2

Comme Jolanda Verhoef a souligné la nouvelle bibliothèque de prise en charge (28.0.1-alpha1) et le nouveau Matériel de bibliothèque de Composants (1.0.0-beta01) offre d'un bien public qui peut être utilisée pour manipuler le mode de déplacement de plus de 3 éléments de menu.

<com.google.android.material.bottomnavigation.BottomNavigationView
    ...
    app:labelVisibilityMode="labeled"
    ... 
/>

Dans le Matériel de bibliothèque de Composants, il s'applique également si il y a 5 éléments de menu.

53voto

Junbin Deng Points 321

Depuis la bibliothèque de support 28.0.0-alpha1:

 <android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled" />
 

29voto

Pafoid Points 318

Pour désactiver l'animation de texte, vous pouvez également l'utiliser dans votre fichier dimens.xml:

 <dimen name="design_bottom_navigation_active_text_size">12sp</dimen>
 

23voto

Lunkie Points 335

Vous pouvez maintenant utiliser app:labelVisibilityMode="[labeled, unlabeled, selected, auto]" en 28-alpha

  • labeled permettra de garder toutes les étiquettes visibles.
  • unlabeled permettra de n'afficher que les icônes.
  • selected indiquent uniquement l'étiquette de l'élément sélectionné et maj des éléments.
  • auto choisissent étiquetés ou sélectionnées sur la base du nombre d'articles que vous avez. étiquetés de 1 à 3 éléments et sélectionnés pour 3+ articles.

17voto

ElegyD Points 1357

La réponse de Przemysław dans Kotlin en tant que fonction d'extension

 @SuppressLint("RestrictedApi")
fun BottomNavigationView.disableShiftMode() {
    val menuView = getChildAt(0) as BottomNavigationMenuView
    try {
        val shiftingMode = menuView::class.java.getDeclaredField("mShiftingMode")
        shiftingMode.isAccessible = true
        shiftingMode.setBoolean(menuView, false)
        shiftingMode.isAccessible = false
        for (i in 0 until menuView.childCount) {
            val item = menuView.getChildAt(i) as BottomNavigationItemView
            item.setShiftingMode(false)
            // set once again checked value, so view will be updated
            item.setChecked(item.itemData.isChecked)
        }
    } catch (e: NoSuchFieldException) {
        Log.e(TAG, "Unable to get shift mode field", e)
    } catch (e: IllegalStateException) {
        Log.e(TAG, "Unable to change value of shift mode", e)
    }
}
 

Utilisation (avec les extensions Kotlin Android):

 bottom_navigation_view.disableShiftMode()
 

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