最近在做项目,用到了这个来控制Fragment的显示。
然后这个控件的动画有点不符合我的要求(虽然动画很酷)~
超过三个Item的时候会出现这种动画效果。
我们要做的是去除它的上移动画。
然后开始了百度各种方法来解决。网上基本都是这个方法:
/**
* @author waino
* @date 2018/8/21
* @desc todo
*/
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);
item.setShiftingMode(false);
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
然后我发现里面的这行代码方法找不到!
item.setShiftingMode(false);
然后我抱着侥幸的心理,打了Shifting, 然后我发现有一个这个方法
item.setShifting(false);
我想着,应该OK了。 心里那是爽的一批。
然后运行上去,没啥用。
然后在国外的网站上翻到了这个,大概是因为百度上的方法都是针对以前的吧。现在更新了。我的版本是:
compile 'com.android.support:design:28.0.0-rc01'
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.1-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"
...
/>
所以解决办法就是在布局里面加属性就好了:
app:labelVisibilityMode="labeled"
有几个动画的选项,可以自己控制~
我觉得吧,就应该要这么简单就能控制。
参考文档:https://stackoverflow.com/questions/40176244/how-to-disable-bottomnavigationview-shift-mode