Supprimer le mode D'Animation/déplacement de BottomNavigationView android [dupliquer]
cette question a déjà une réponse ici:
je construis une application dans laquelle j'ai une vue de Basenavigation. Tout fonctionne bien jusqu'à ce que j'arrive à L'activité.
le La Navigation est la suivante:
le problème est qu'il a cette animation par défaut donc il pousse l'élément actif chaque fois plus haut que le reste.
Autre Exemple:
donc ma question Est comment se débarrasser de cette animation par défaut et chaque élément est aligné quand je change entre eux?
mon code:
public class MainActivity extends AppCompatActivity {
private BottomNavigationView bottomNavigationView;
private Fragment fragment;
private FragmentManager fragmentManager;
private FragmentTransaction transaction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupBottomBar();
}
private void setupBottomBar() {
bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottomBar);
fragmentManager = getSupportFragmentManager();
fragment = new CardDeckFragment();
transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.activity_main, fragment).commit();
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.action_card_deck:{
Toast.makeText(MainActivity.this, "Card Deck Selected", Toast.LENGTH_SHORT).show();
fragment = new CardDeckFragment();
break;
}
case R.id.action_favorites:{
Toast.makeText(MainActivity.this, "Favorites Selected", Toast.LENGTH_SHORT).show();
fragment = new FavoritesFragment();
break;
}
case R.id.action_favorites_another:{
Toast.makeText(MainActivity.this, "Image Selected", Toast.LENGTH_SHORT).show();
fragment = new ImageFragment();
break;
}
case R.id.action_profile:{
Toast.makeText(MainActivity.this, "Profile Selected", Toast.LENGTH_SHORT).show();
fragment = new ProfileFragment();
break;
}
case R.id.action_menu:{
Toast.makeText(MainActivity.this, "Menu Selected", Toast.LENGTH_SHORT).show();
fragment = new MenuFragment();
break;
}
}
transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.activity_main, fragment).commit();
return true;
}
});
}
}
et ma mise en page:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.realtimegaming.androidnative.testproject.MainActivity">
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottomBar"
android:layout_alignParentBottom="true"
android:background="@color/brown"
android:layout_gravity="bottom"
android:gravity="bottom"
android:layout_marginTop="?attr/actionBarSize"
app:itemBackground="@color/colorPrimary"
app:menu="@menu/bottom_navigation_main"
app:itemIconTint="@color/white"
android:fitsSystemWindows="true"
android:animateLayoutChanges="false"
android:splitMotionEvents="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
1 réponses
Ok j'ai trouvé un moyen au cas où ça aiderait quelqu'un d'autre. Donc par défaut BottomNavigationView ajoute shiftingmode = true quand il y a plus de 3 items.
pour le moment, vous ne pouvez pas le changer par L'API existante et la seule façon de désactiver le mode shift est d'utiliser la réflexion.
donc nous pouvons utiliser cet helper pour se débarrasser de ceci:
class BottomNavigationViewHelper {
static void removeShiftMode(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);
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");
}
}
}
et puis l'utiliser comme ceci:
BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottomBar);
BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);
Espérons que cette aide quelqu'un avec le même problème avec moi!!!
rappelez-vous, vous devrez exécuter cette méthode chaque fois que vous changez les éléments de menu dans votre BottomNavigationView.
mise à JOUR
comme pour la question stackoverflow , vous devez également mettre à jour le fichier de configuration proguard (par exemple proguard-rules.pro), code ci-dessus utilise la réflexion et ne fonctionnera pas si proguard obfuscate le mShiftingMode champ.
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}