Mise en œuvre de la BottomNavigationView
condition: lorsqu'il y a plus de 3 éléments, utilisez le mode shift.
Pour le moment, vous ne pouvez pas le modifier via l'API existante et la seule façon de désactiver le mode shift est d'utiliser la réflexion.
Vous aurez besoin d'une classe d'aide:
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);
}
}
}
Et puis appliquez la disableShiftMode
méthode sur votre BottomNavigationView
, mais rappelez-vous que si vous gonflez la vue du menu à partir de votre code, vous devez l'exécuter après avoir gonflé.
Exemple d'utilisation:
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
PS.
N'oubliez pas que vous devrez exécuter cette méthode chaque fois que vous modifiez les éléments de menu dans votre BottomNavigationView
.
METTRE À JOUR
Vous devez également mettre à jour le fichier de configuration de proguard (par exemple proguard-rules.pro), le code ci-dessus utilise la réflexion et ne fonctionnera pas si proguard obscurcit le mShiftingMode
champ.
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
Merci à Muhammad Alfaifi d'avoir signalé ce problème et d'avoir fourni un extrait .
MISE À JOUR 2
Comme Jolanda Verhoef l'a souligné, la nouvelle bibliothèque de support ( 28.0.0-alpha1
) ainsi que la nouvelle bibliothèque de composants matériels ( 1.0.0-beta01
) offrent une propriété publique qui peut être utilisée pour manipuler le mode de décalage sur 3 éléments de menu.
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"
...
/>
Dans la bibliothèque des composants matériels, cela s'applique également s'il y a 5 éléments de menu.
MISE À JOUR 3
Comme @ThomasSunderland l'a également souligné, vous pouvez définir cette propriété sur false app:itemHorizontalTranslation="false"
sans Enabled
suffixe pour désactiver l'animation de décalage.
vous pouvez consulter le guide complet de la mise en forme du BottomNavigation ici