Supprimez le mode Animation / Déplacement de BottomNavigationView android

Je construis une application dans laquelle j'ai un BottomNavigationView. Tout fonctionne bien jusqu'à ce que j'arrive à l'activité.

La navigation est la suivante:

  • Android: Enregistrez l'objet android.net.Uri à la base de données
  • AudioRecord - Comment obtenir des données dans le tampon?
  • Android: besoin d'enregistrer l'entrée du micro
  • Le système d'exploitation Android lance-t-il un wakelock si l'application ou le service qui le retient est tué?
  • Jet d'images Android EGL / OpenGL ES
  • Pourquoi la même interface est-elle diffusée différemment sur un émulateur et un périphérique?
  • Entrez la description de l'image ici

    Le problème, c'est qu'il a cette animation par défaut afin qu'il pousse l'élément actif chaque fois plus haut que le reste.

    Un autre exemple:

    Entrez la description de l'image ici

    Donc, ma question est de savoir comment vous débarrasser de cette animation par défaut et chaque élément est aligné lorsque 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> 

  • Impossible de trouver des fichiers d'en-tête - NDK Android
  • Préférences de la liste Android: avez-vous un résumé en tant que valeur sélectionnée?
  • Utilisation de cookies avec la librairie Volley Android
  • Dernier Apke HttpClient dans Android SDK
  • Comment activer le script java dans le WebView
  • Existe-t-il un moyen de demander une permission par programme?
  • One Solution collect form web for “Supprimez le mode Animation / Déplacement de BottomNavigationView android”

    D'accord, j'ai trouvé un moyen pour aider quelqu'un d'autre. Donc par défaut BottomNavigationView ajouter shiftingmode = true quand il est plus de 3 éléments.

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

    Nous pouvons donc utiliser cette aide pour nous 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 utilisez-le comme ceci:

     BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottomBar); BottomNavigationViewHelper.removeShiftMode(bottomNavigationView); 

    J'espère que cela aide quelqu'un avec le même problème avec moi !!!

    Rappelez-vous, vous devez exécuter cette méthode chaque fois que vous modifiez les éléments du menu dans votre BottomNavigationView.

    METTRE À JOUR

    Selon une autre question de stackoverflow , 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 obstrue le champ mShiftingMode.

     -keepclassmembers class android.support.design.internal.BottomNavigationMenuView { boolean mShiftingMode; } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.