web-dev-qa-db-fra.com

Supprimer le mode animation / décalage 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:

enter image description here

Le problème est qu’il a cette animation par défaut, il pousse donc l’élément actif plus haut que le reste.

Un autre exemple:

enter image description here

Ma question est donc de savoir comment se débarrasser de cette animation par défaut et que chaque élément est aligné lorsque je bascule 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>
32
user7157256

Ok j'ai trouvé un moyen au cas où cela aide quelqu'un d'autre. Donc, par défaut, BottomNavigationView ajoute shiftingmode = true quand il y a plus de 3 éléments.

Pour le moment, vous ne pouvez pas le modifier via une API existante et le seul moyen de désactiver le mode Shift 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 ensuite l'utiliser 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 !!!

N'oubliez pas que vous devez exécuter cette méthode chaque fois que vous modifiez des éléments de menu dans votre BottomNavigationView.

[~ # ~] met à jour [~ # ~]

Selon différent 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 obscurcit le champ mShiftingMode.

-keepclassmembers class Android.support.design.internal.BottomNavigationMenuView { 
    boolean mShiftingMode; 
}
74
user7157256