the support library icon how exploring bottom bar android bottomnavigationview android-bottomnav

support - Eliminar el modo Animación/Cambio de BottomNavigationView android



how to use bottom navigation view in android (1)

Ok encontré una forma en caso de que ayude a alguien más. Por lo tanto, de forma predeterminada, BottomNavigationView agrega shiftingmode = true cuando tiene más de 3 elementos.

En este momento no puede cambiarlo a través de la API existente y la única forma de desactivar el modo de cambio es usar la reflexión.

Entonces podemos usar este ayudante para deshacernos de esto:

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

y luego usarlo así:

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

Espero que esto ayude a alguien con el mismo problema conmigo !!!

Recuerde, deberá ejecutar este método cada vez que cambie los elementos del menú en su BottomNavigationView.

ACTUALIZAR

Según la pregunta de stackoverflow diferente, también necesita actualizar el archivo de configuración de proguard (por ejemplo, proguard-rules.pro), el código anterior usa la reflexión y no funcionará si proguard ofusca el campo mShiftingMode.

-keepclassmembers class android.support.design.internal.BottomNavigationMenuView { boolean mShiftingMode; }

Esta pregunta ya tiene una respuesta aquí:

Estoy creando una aplicación en la que tengo un BottomNavigationView. Todo funciona bien hasta que llegue a la Actividad.

La navegación es esta:

El problema es que tiene esta animación predeterminada, por lo que empuja el elemento activo cada vez más alto que el resto.

Otro ejemplo:

Entonces, mi pregunta es ¿cómo deshacerme de esta animación predeterminada y cada elemento se alinea cuando cambio entre ellos?

Mi código:

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

y mi diseño:

<?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>