Search code examples
androidanimationiconsbottomnavigationviewandroid-bottomnav

How to remove icon animation for bottom navigation view in android


I have implemented Bottom Navigation View from Design Support Library 25 in my project. I have 5 icons in the view. whenever an icon is selected it's having some animation. But when 3 or fewer icons is not showing any animations. I want to remove that animation and need only some color change for the icon. How can I achieve this? Done enough googling, but couldn't find the solution. Please help. Thanks.


Solution

  • got answer from this thread.

    To remove animation or shift mode.

    Implementation of BottomNavigationView has condition: when there is more than 3 items then use shift mode.

    Create helper class

    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);
            } 
        } 
    } 
    

    Usage

    BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
    BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);