BottomNavigationView 底部导航的处理longClick 处理成和onClick的行为一样

先看一下 BottomNavigationView的结构:
在这里插入图片描述
本来想录成gif呢 无奈最大只能上传5M 所以就不传了 所代码贴出来

  menuView = (BottomNavigationMenuView) navView.getChildAt(0);
//        BottomNavigationItemView
        //BottomNavigationItemView  这才是一个子条目
        Class<? extends BottomNavigationMenuView> aClass = menuView.getClass();
        Field presenter = null;
        Field menu = null;
        try {
            presenter = aClass.getDeclaredField("presenter");
            menu = aClass.getDeclaredField("menu");
            menu.setAccessible(true);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        presenter.setAccessible(true);
        menu.setAccessible(true);
        try {
            myPresenter = (BottomNavigationPresenter) presenter.get(menuView);
            myMenu = (MenuBuilder) menu.get(menuView);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }


        menuView.findViewById(R.id.navigation_home).setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {

                v.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        if(event.getAction()==MotionEvent.ACTION_UP){

                            BottomNavigationItemView itemView = (BottomNavigationItemView) v; //向源码学习
                            @SuppressLint("RestrictedApi") MenuItem item = itemView.getItemData();
                            if (!myMenu.performItemAction(item, myPresenter, 0)) {
                                item.setChecked(true);
                            }
                        }
                        return true;
                    }
                });




                return true;
            }
        });
//        menuView.findViewById(R.id.navigation_home).setBackground(null);
        menuView.findViewById(R.id.navigation_home).setBackgroundResource(0);//去除水波纹的效果
        menuView.findViewById(R.id.navigation_dashboard).setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
              v.setOnTouchListener(new View.OnTouchListener() {
                  @Override
                  public boolean onTouch(View v, MotionEvent event) {
                     if(event.getAction()==MotionEvent.ACTION_UP){
                         BottomNavigationItemView itemView = (BottomNavigationItemView) v;
                         @SuppressLint("RestrictedApi") MenuItem item = itemView.getItemData();
                         if (!myMenu.performItemAction(item, myPresenter, 0)) {
                             item.setChecked(true);
                         }
                     }
                      return true;
                  }
              });


                return true;
            }
        });
        menuView.findViewById(R.id.navigation_dashboard).setBackgroundResource(0);
        menuView.findViewById(R.id.navigation_notifications).setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
               v.setOnTouchListener(new View.OnTouchListener() {
                   @Override
                   public boolean onTouch(View v, MotionEvent event) {
                       if(event.getAction()==MotionEvent.ACTION_UP) {

                           BottomNavigationItemView itemView = (BottomNavigationItemView) v;
                           @SuppressLint("RestrictedApi") MenuItem item = itemView.getItemData();
                           if (!myMenu.performItemAction(item, myPresenter, 0)) {
                               item.setChecked(true);
                           }
                       }
                       return true;
                   }
               });
                return true;
            }
        });

        menuView.findViewById(R.id.navigation_notifications).setBackgroundResource(0);

思路:
我们通过查看 BottomNavigationView的结构可以看出
它包了一层才是我们的 tab

在这里插入图片描述
所以 我们把 gitChild把这一层找出来

 BottomNavigationView navView = findViewById(R.id.nav_view);
      //  closeAnimation(navView);
        menuView = (BottomNavigationMenuView) navView.getChildAt(0);

找出之后
我们会发现 tab的 容器是一个 BottomNavigationItemView 我们去这个类的源码里面 没有到的 Click事件 (如标题我们的目录 是要把 长按事件处理成和点击事件一样所以我们要看一下 它的点击事件是如何写的)
但你发现 BottomNavigationItemView 里面根本没有找到处理点击事件的地方 。

我们去 BottomNavigationItemView的上层去找找看结果有发现在这里插入图片描述
找到入口了但还有个问题 就是下面这两个变量

在这里插入图片描述

私有并没有提供获取方法 (所以只能通过反射获取了)

在这里插入图片描述

反射获取

在这里插入图片描述

设置三个Tab的长按事件这里只贴一个(其它的都一样)

在这里插入图片描述
onLongClick 返回true 是自己把事件消费掉不再上层传递,后台只又加上了 setOnTouchListener 是因为如果不处理的话 用户按下不松手的话长按事件直接响应了 我想要的效果是用户抬起手指后再做响应。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值