Remove Animation/Shifting mode from BottomNavigationView android
Ok i found a way in case it helps someone else. So by default BottomNavigationView add shiftingmode = true when its more than 3 items.
At this moment you cannot change it through existing API and the only way to disable shift mode is to use reflection.
So we can use this helper to get rid of this:
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");
}
}
}
and then use it like this:
BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottomBar);
BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);
Hope this helps someone with the same problem with me!!!
Remember, you'll need to execute this method each time you change menu items in your BottomNavigationView.
UPDATE
As per different stackoverflow question, you also need to update proguard configuration file (e.g. proguard-rules.pro), code above uses reflection and won't work if proguard obfuscate the mShiftingMode field.
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
How to disable BottomNavigationView shift mode?
Implementation of BottomNavigationView
has condition: when there is more than 3 items then use shift mode.
At this moment you cannot change it through existing API and the only way to disable shift mode is to use reflection.
You'll need 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);
}
}
}
And then apply disableShiftMode
method on your BottomNavigationView
, but remember if you are inflating menu view from your code, you have to execute it after inflating.
Example usage:
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
PS.
Remember, you'll need to execute this method each time you change menu items in your BottomNavigationView
.
UPDATE
You also need to update proguard configuration file (e.g. proguard-rules.pro), code above uses reflection and won't work if proguard obfuscate the mShiftingMode
field.
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
Thanks Muhammad Alfaifi for pointing this issue and providing snippet.
UPDATE 2
As Jolanda Verhoef pointed out the new Support library (28.0.0-alpha1
) and also the new Material Components library (1.0.0-beta01
) offers a public property which can be used to manipulate the shifting mode over 3 menu items.
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"
...
/>
In Material Components library it also applies if there are 5 menu items.
UPDATE 3
As @ThomasSunderland also pointed out, you can set this property to false app:itemHorizontalTranslation="false"
without Enabled
postfix to disable shifting animation.
you can check the full guide to styling the BottomNavigation here
How to remove icon animation for bottom navigation view in android
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);
Android Kotlin - Material Bottom Navigation Disable Shift Mode and Selete Menu
Answer 2. Use false, Bottom Navigation will not select the icon
bottom_navigation.setOnNavigationItemSelectedListener {
when(it.itemId) {
R.id.homeFragment -> {
showNav(HomeFragment())
true
}
R.id.accountFragment -> {
startActivity(Intent(this, MainActivity2::class.java))
false
} else -> true
}
}
BottomNavigationView: Disable animation for adding/inflating menu runtime
I solved problem by using TransitionManager.endTransitions(...)
binding.navigation.menu.clear()
binding.navigation.inflateMenu(menuId)
TransitionManager.endTransitions(binding.navigation.getChildAt(0) as NavigationBarMenuView)
Maybe it will help someone else. If you have better way to solve this let me know. Thanks in advance!
How do I disable the animation in Bottom Navigation View when icons are clicked?
//Create a new class Bottom Navigation Bar helper and then implement it in the buttons classes
public class BottomNavigationViewHelper {
@SuppressLint("RestrictedApi")
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);
}
}
//and then just use this code in every button class
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_activity);
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomNavViewBar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
BottomNavigationViewHelper.enableNavigation(mContext, bottomNavigationView);
Menu menu=bottomNavigationView.getMenu();
MenuItem menuItem=menu.getItem(ACTIVITY_NUM);
menuItem.setChecked(true);
}
This will make the buttons perform nicely.
I am new to android, the code is not written by me but I hope it helps you
how to remove default animation transition when using navigation component in Android?
UPDATE: The latest file path please see comment below.
You can add anim file to replace the default animation.
- res/anim/nav_default_enter_anim.xml
- res/anim/nav_default_exit_anim.xml
- res/anim/nav_default_pop_enter_anim.xml
- res/anim/nav_default_pop_exit_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--Empty to disable animation-->
</set>
[Navigation Component] I can`t change animation from NavigationUI.setupWithNavController()
Related Topics
Play Store Having New Version of The App, But Not Showing Update
Inconsistency Detected in Recyclerview, How to Change Contents of Recyclerview While Scrolling
Warning: Quick Boot/Snapshots Not Supported on This Machine
Set Drag Margin for Android Navigation Drawer
Get Application Installed Date on Android
Android Viewpager Padding/Margin Between Page Fragments
Is Discard Bad for Program Performance in Opengl
Remove Android Default Action Bar
How to Get Thumbnail for Video in My /Sdcard/Android/Data/Mypackage/Files Folder
User Does Not Have Permission to Access This Object . Firebase Storage Android
Build Flavors for Different Version of Same Class
How to Look-Up a Contact's Name from Their Phone Number on Android
Error "Package Android.Support.V7.App Does Not Exist"
Set Animated .Gif as Background Android
Rotating Image. Animation List or Animated Rotate? (Android)