时间: 2020-09-7|tag:24次围观|0 条评论

原文:https://blog.csdn.net/xiaoyangsavvy/article/details/70213537
官方的BottomNavigationView默认有个放大的ShiftingMode效果,但是尚未支持代码层级的切换。在3个menu item及以下时默认关闭,而到了4个及以上时就懵逼了,因为我们是要做ViewPager的侧滑啊!

(转)安卓-BottomNavigationView关闭shiftingMode效果插图
image

滑动时,ViewPager是切换过去了,下面这item也切换过去了,但是你说说这效果是不是坑爹!!?

没办法了,查了一圈资料,发现官方这个控件还不支持代码层级的切换选项(如果你发现了,请告诉我)。迫不得已,只能看源码,开启上帝(反射)模式了!

(转)安卓-BottomNavigationView关闭shiftingMode效果插图1
image
package com.fedming.bottomnavigationdemo;import android.support.design.internal.BottomNavigationItemView;import android.support.design.internal.BottomNavigationMenuView;import android.support.design.widget.BottomNavigationView;import java.lang.reflect.Field;// 利用反射,改变 item 中 mShiftingMode 的值public class BottomNavigationViewHelper {    public static void disableShiftMode(BottomNavigationView navigationView) {        BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigationView.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 itemView = (BottomNavigationItemView) menuView.getChildAt(i);                itemView.setShiftingMode(false);                itemView.setChecked(itemView.getItemData().isChecked());            }        } catch (NoSuchFieldException | IllegalAccessException e) {            e.printStackTrace();        }    }}

我们通过反射拿到了BottomNavigationMenuView,至于为什么是BottomNavigationView 的第一个子View这就要看源码了,AS中直接可以点进去看。然后我们知道了这个效果是由mShiftingMode来决定的,那么上面的代码就好理解了。

在实例化BottomNavigationView后调用一次这行代码即可:

BottomNavigationViewHelper.disableShiftMode(bottomNavigationView)

如果不需要配置侧滑切换的话,直接默认效果就好,不要去反射修改了。禁止滑动时,为ViewPager添加setOnTouchListener接口,在onTouch下直接消费掉点击事件。添加下面这段代码:

//禁止ViewPager滑动viewPager.setOnTouchListener(new View.OnTouchListener() {@Override    public boolean onTouch(View v, MotionEvent event) {      return true;    }});

最后来看下效果:

(转)安卓-BottomNavigationView关闭shiftingMode效果插图2
image

文章转载于:https://www.jianshu.com/p/3934553acbab

原著是一个有趣的人,若有侵权,请通知删除

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《(转)安卓-BottomNavigationView关闭shiftingMode效果
   

还没有人抢沙发呢~