ViewPager结合TabLayout --- 禁止滑动(点击切换)

BottomNavigationView+ViewPager+Fragment+TabLayout 常见设计问题解决 2019.10.31更新: 禁止viewpager滑动的办法。项目中的那个有点问题。 package com.vwiov.enterpriseapp.widget; import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; impor... 阅读详情

【记录】菜鸟记录点滴

场景: ViewPager结合TabLayout,两个Tab项(Tab1, Tab2),需要先在Tab1执行某些操作后,才能滑动ViewPager(点击Tab)切换到Tab2

1. 首先自定义CustomViewPager,可以设置允许/禁止滑动ViewPager。

继承ViewPager,根据事件的分发机制,修改onInterceptTouchEvent()

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if(canScroll){
            return super.onInterceptTouchEvent(ev);
        } else {
            return false;
        }
    }

ViewPager继承ViewGroup,禁止滑动时,canScroll = false,此时自定义的CustomViewPager不会拦截Touch事件及消费,继续分发给子View

PS: 通过viewpager.setOnTouchListener()来消费事件,无法真正禁止滑动,此时ViewPager仍可以有小幅度的变化。

补充: 简单查看了ViewGroup与View的dispatchTouchEvent方法,并通过Log确认,设置onTouchListener消费事件后,不会触发onTouchEvent。再次重写响应Scroller的computeScroll方法,ViewPager仍然会移动。

补充:ViewPager没有重写dispatchTouchEvent但是重写了onInterceptTouchEvent,在重写的onInterceptTouchEvent中,move事件是关键。onInterceptTouchEvent最终返回mIsBeingDragged,如果x轴上move的距离满足条件,那么mIsBeingDragged = true,画面会滑动。

if (mIsBeingDragged) {
    // Scroll to follow the motion event
    if (performDrag(x)) {
        ViewCompat.postInvalidateOnAnimation(this);
    }
}

至于为什么只有第一次move会发生滑动,由于事件分发机制的很多细节理解的还不是很透彻,猜测 : dispatchTouchEvent根据target标志决定后续处理,而第一次onInterceptTouchEvent拦截事件交给onTouchEvent消费后会标记target,此后就不会再触发这部分逻辑。

2. 设置TabLayout不可点击切换

参照其他博客的思路,从头开始分析,从层次中看出需要设置TabView,再查看源码。从addTab入手,发现TabView对应Tab类中的mView字段,最终被添加到SlidingTabStrip中(design-27.1.1)。因此利用反射,获取TabView对象,并实现禁止点击。

    TabLayout.Tab tab = tabLayout.getTabAt(1);
    Class clazz = tab.getClass();
    try {
        Field field = clazz.getDeclaredField("mView");
        field.setAccessible(true);
        View view = (View) field.get(tab);
        view.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(canScroll){
                    return false;
                } else {
                    Log.e("lxy", "提示或者干什么...");
                    return true;
                }
            }
        });
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

PS: 类似的,应该也可以反射获得SlidingTabStrip,通过获得子View来设置

补充: 按照上述的分析,实现代码如下,同样可以实现

    Class clazz2 = tabLayout.getClass();
    try {
        Field field = clazz2.getDeclaredField("mTabStrip");
        field.setAccessible(true);
        ViewGroup viewGroup = (ViewGroup) field.get(tabLayout);
        View v = viewGroup.getChildAt(1);
        v.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                ToastUtils.show("不可点击");
                return true;
            }
        });
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

 

Android viewpage实现禁止滑动的功能 主要介绍了Android viewpage实现禁止滑动的功能的相关资料,这里附有实现的实例代码,主要还是重新 ViewPage 这个类,需要的朋友可以参考下 立即下载

相关推荐

Android——Handler详解

1. 简介 Handler是一套 Android 消息传递机制 可以说只要有异步线程与主线程通信的地方就一定会有 Handler。 在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理 使用Handler消息传递机制主要是为了多个线程并发更新UI的同时,保证线程安全 2. 相关概念解释 Handler、Message、Message Queue、Looper Android消息机制: 以Handler的sendMes

Yawn 7万+

Android中TabLayout+ViewPager禁止滑动,但可点击Tab

参考网址:https://www.cnblogs.com/zhujiabin/p/7471665.html 1.点击TabLayout去除ViewPager的滑动效果 public class NoScrollViewPager extends ViewPager { private boolean noScroll = false; public NoScrollViewPager(Context context, AttributeSet attrs) { sup

aidou1314的博客 4517

【数据集】waymo motion dataset介绍与数据解析可视化

waymo motion数据集下载,数据描述,数据特征和地图特征,数据解析并完成数据可视化

shuaixio的博客 5181

Android 禁止Tablayout横向滑动

public class MyViewPager extends ViewPager { private boolean scroll = true; public MyViewPager(Context context) { super(context); } public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); } .

weixin_42630638的博客 1355

英雄联盟(MOBA)完整制作教程

这是一份从零到上线、可落地的 LOL 风格 MOBA 游戏开发全流程教程,覆盖策划、美术、程序、测试、运营全环节,适合独立团队或学习参考。

qq_35779316的博客 542

pwscf与wannier90 Hands-On实战训练(一)——费米面计算为例

系列文章目录 Quantum Espresso Hands-On实战训练(三)——DOS计算 文章目录系列文章目录计算过程pwscf直接得到等能面pwscf和wannier90得到等能面pwscf直接得到等能面1. scf2. nscf3. 后处理pwscf和wannier90得到等能面1. Kpoints2. scf3. nscf4. pw2wan及wannier90.x5. XCrySDen可视化 计算过程 pwscf直接得到等能面 pwscf和wannier90得到等能面 pwscf直接得到等能面

weixin_45973682的博客 5070

优雅的拦截TabLayout的点击事件

优雅的拦截TabLayout的点击事件

City_Coder的博客 3817

PyTorch深度学习项目实战100例数据集

最近很多订阅了的用户私信咨询有些数据集下载不了以及一些文章中没有给出数据集链接,为了解决这个问题,专门开设了本篇文章,提供数据集下载链接,打包100例的所有数据集。本专栏适用人群:深度学习初学者,专栏将具体讲解如何快速搭建深度学习模型用自己的数据集实现深度学习小项目。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

优快云 精品推荐 2万+

TabLayout + ViewPager2组合,禁止viewpager2左右滑动

禁止viewPager2的左右滑动

oAiYinSiTan12的博客 5669

SPICE框架:自博弈提升大语言模型推理能力

自博弈训练是提升大语言模型推理能力的前沿技术,其核心思想是通过模型自我对话实现持续迭代优化。SPICE框架创新性地采用文档驱动的自博弈机制,结合思维链提示和迭代式上下文扩展,显著提升模型在数学证明、逻辑推理等复杂任务中的表现。该技术在代码生成、金融分析等工程场景中展现出23%-41%的性能提升,其关键技术包括多样性控制、质量过滤和记忆管理。随着与RLAIF等强化学习方法的结合,这种训练范式正在推动大模型向更接近人类思维方式的推理能力进化。

weixin_28686771的博客 402

【ODX介绍】-5-用于Flash刷写的ODX-F文件概述

用于Flash刷写的ODX-F文件概述

「汽车电子助手」的博客 2531

TabLayout+ViewPager撤消左右滑动切换功能

要求某种情况下ViewPager和TabLayout取消滑动保留点击,那么我们只需要重写这个方法就可以禁止ViewPager滑动就行了 import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.Mot

zhang3616143的博客 5027

使用MATLAB中的Simulink工具来构建一个微电网系统的仿真平台

微电网是指由分布式电源(如太阳能、风能等)、储能装置、负载以及控制和保护装置组成的局部电力系统。它可以独立于主电网运行,也可以与主电网并联运行。本示例将以一个简单的微电网为例,展示如何利用Simulink进行微电网接入与孤岛运行策略的设计与仿真。分布式电源:模拟太阳能光伏板或风力发电机等分布式电源。储能装置:用于存储多余能量或补充不足能量。负载:模拟实际用电需求。双向变流器:实现直流与交流之间的转换,并支持并网和孤岛模式切换。控制器:负责管理微电网的运行模式,包括并网控制和孤岛控制。

xiaoheshang_123的博客 348

关于Android ViewPager禁止滑动

ViewPager默认是可以手动切换的,实现自动切换,可以通过定时器来完成,而有些时候,我们是需要禁止ViewPager手动切换的,这个时候就需要自定义ViewPager了,其实也很简单,原理就是拦截触摸事件,让ViewPager不处理onTouch事件,直接交给他的子控件去处理就行。...

怎么可以吃恐龙呢 6042

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

TabLayout+ViewPager禁止滑动

1、重写ViewPager并重写覆盖ViewPager的onInterceptTouchEvent(MotionEvent arg0)方法和onTouchEvent(MotionEvent arg0)方法,这两个方法的返回值都是boolean类型的,只需要将返回值改为false,那么ViewPager就不会消耗掉手指滑动的事件了,转而传递给上层View去处理或者该事件就直接终止了。 2、和TabL...

陈立的博客 5653

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ViewPager屏蔽左右滑动和切换时的滚动动画

需重写ViewPager,覆盖ViewPager的onInterceptTouchEvent(MotionEvent arg0)方法。* 这样ViewPager就不会消耗掉手指滑动的事件了,转而传递给上层View去处理或者该事件就直接终止了。这样ViewPager就不会消耗掉手指滑动的事件了,转而传递给上层View去处理或者该事件就直接终止了。* 这两个方法的返回值都是boolean类型的,只需要将返回值改为false。* 则需重写viewpager的setCurrentItem()方法就可以了。

s_nshine的博客 2807

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 禁止屏幕点击事件,拦截tablayout 点击事件,不触发viewpaper滚动 例如登陆检测等场景...

场景描述app架构是底下有四个tab,点击tab切换fragment,但是产品要求,点击tab之前需要检测是否登陆,如果未登录,直接跳转登陆提示,页面不进行切换首先是架构,我们使用TabLayout + Viewpaper + Fragment 来实现,登录提示,只要拿到TabLayout的Tab 监听它的OnClickListener,可是。。。。转折来的太突然。。。public static ...

weixin_31237295的博客 2010

关于Tablayout包含Viewpager,滑动view pager到最后一个子view,继续滑动导致切换到Tablayout第二个fragment的问题

如题,本来我是上面tablayout+viewpager然后view pager这个Afragment里面还是有个view pager图片,可以左右划的,之前没注意,因为滑动到最后一张图片的时候,继续滑动就会使tablayout切换到第二个Bfragment上面去,产品说不行,要滑倒最后一张图片的时候不能滑动,不能切换到另一个页面。。类似与这样的,没办法,那就去快乐星球去研究吧。。研究一上午,还算成功了吧,下面直接贴代码,只需要在xml里面替换左右滑动的viewpager就行了,如果不对,不负责任的哦。。

BetterMez的博客 575

Android TabLayout+ViewPager禁止滑动

1、重写ViewPager并重写覆盖ViewPager的onInterceptTouchEvent(MotionEvent arg0)方法和onTouchEvent(MotionEvent arg0)方法,这两个方法的返回值都是boolean类型的,只需要将返回值改为false,那么ViewPager就不会消耗掉手指滑动的事件了,转而传递给上层View去处理或者该事件就直接终止了。 2、和Tab...

weixin_34195546的博客 2647

Android使用Tablayout+ViewPager结合实例

最近因为工作原因,需要转入Android开发,此后不定时记录一些技巧。 要求: 1、设计一个界面,上半部不动,下半部为滑块,点击Tablayout标题,更换不同Fragment,禁止左右滑动更改,不需要更改界面动画; 2、第一个滑块使用FlowLayout显示小标,且为其设置不重复颜色的边框等样式; 3、第二个滑块一键删除EditView输入内容。 实现图示: 完整项目可看github 关于themes的一些小设计 在themes.xml的style样式中可添加以下内容 <item name="w

t_123_y的博客 1386

屏蔽ViewPager的左右滑动和切换时的滚动动画

【转载请注明出处:From李诗雨—http://blog.youkuaiyun.com/cjm2484836553/article/details/78014447】 不诗意的女程序猿不是好厨师~ 我们经常会使用到 ViewPager+Fragment+TabLayout 这种类似的组合。那么各种不同的需求也就来了。有时需要viewpager不可左右滑动,但保留切换时的滚动动画。 有时则需要viewpag

cjm2484836553的博客 1708

总结三:TabLayout+ViewPager实现页面切换

目前使用的方式 原来使用的方式 如何懒加载 如何禁止viewpager滑动 如何刷新 笔者为何会记录这个实现,盖因对业务的需要,导致笔者在两个不同的项目中采用了完全不一样的实现方式,一个至繁,一个至简。 一、目前的方式 此处先附上两份代码: Fragment.java /** * 各个View */ @BindView(R2.id.tab_layout) TabLayout t...

m0_37063730的博客 712

ViewPager(七)让ViewPager用起来更顺滑——轮播、禁止滑动与指示器的配合

用法概述: 1、换页监听与换页方法 2、懒加载及预加载定制 3、设置间距与添加转场动画 4、轮播、禁止滑动与指示器的配合 ViewPager的应用部分迎来了收关,这次我们更强调ViewPager的综合运用能力。无论是ViewPager的改造变种,还是与指示器的配合使用,都拓展了ViewPager的应用场景。 轮播、禁止滑动与指示器的配合 轮播更准确来说,叫自动轮播。不用手滑,像放电影一样的循环播放...

郝振兴的博客 950

小程序实现贴近原生端的 TabLayout + ViewPager 切换效果

小程序中实现贴近原生端的 TabLayout 组件

子文的博客 952

Tablayout自定义+viewpage2

自定义tab实现

qq_32670947的博客 2107
下一篇: TabLayout --- 修改指示器
FeiLaughing
博客等级 码龄11年 1粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值