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.