记录下帮助一位网友解决的关于android子控件的onTouch或onClick和父OnTouch 冲突的问题。

前三天收到位网友的私信求助,问题大概如标题所示。具体是下面的情况,个人感觉,这个问题挺有趣,也会在实际项目开发中很常见。不想看前奏的请直接跳至解决方法。

问题原型:

父控件是自定义的 LinearLayout,目的是实现下拉刷新,这个自定义View的实现下拉操作思想是通过检测 onTouch 事件,然后,子控件有一个 scrollView,它是完全为了实现下滚和滚到底部实现加载更多的监听。看到这,我相信任何一个有类似项目开发经验的人,都会感到很熟悉的。下拉刷新+下滑加载更多。

      在 scrollView 里面的第一层View里面有很多一样的自定义的 View,每个有具备自身的 onClick 和 onTouch 事件,目的是为了在用户点击的时候实现变色和相应。

      问题来了,根据他说的,每次点击,总是先实现 自定义View的 onTouch 的down,然后是 onClick,而 父 Linearlayout的 onTouch是最后实现,而且,父的 action_down 没有执行,这样就直接导致了父View 拿不到用户的 点击坐标,下拉刷新出问题!就是说,各种冲突。

      我们知道,在同一个 View中,注意,是同一个 View,没嵌套的情况下,用户手势事件执行顺序是:

      onTouch->onLongClick->onClick。

交谈细节:

我问:你自己百度过了吗?

        他答:嗯,百度上有onClick和onTouch的冲突例子,但是全都是针对同一个 View的情况下,而且 无论onTouch返回false不阻断还是true阻断继续传送下去,都是无作用。

        他的回答很清晰,他的这个状况的冲突是 嵌套的,大家大可百度下,因为我在帮他的时间里,也百度过,基本无答案。最能接近的是父View的onTouch里面使用 requestDisallowInterceptTouchEvent 来允许这个手势事件能传给 子View,但是,他的这个问题是,儿子不爽父亲先的。确实蛋碎。

        我再问:是不是你的布局有问题,怎么会是子 View 阻断 父 View?

        他再答:他的布局就是正常的嵌套。

        在无语了一会之后,想了下,觉得这样应该可以搞定。

解决方法:

既然传统的解决方法解决不了,我当时想到的是:

     1:子View 使用父类的 onTouch 接口来实现点击和改变颜色,总之就是子View不要自己再实现 onClick和onTouch;

     2:父View 实现个接口,供子View实现自己的onTouch内容;

     3:当用户onTouch的时候,父View 在恰当的时候调用该接口,实现子View的请求的功能。

这样所会产生的问题:

     因为它的这个父View是整个使用onTouch来实现下拉的,所以:

     1:用户点击后会产生两次的 onTouch执行,一次是子 View,第二次是 父View。

     这样就需要他来使用逻辑区分了,逻辑区分不难,几个 boolean 即可,所用内存几个 bit。

最后问他,这样能否接受,他说试试先,刚刚发信息来,完美解决。逐有感而发此文。

在我们百度或请教人都解决不了的问题的情况下,应该自己思考下动手解决!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏QQ音乐技术团队的专栏

Android动态布局入门及NinePatchChunk解密

摆脱XML布局文件 相信每一个Android开发者,在接触“Hello World”的时候,就形成了一个观念:Android UI布局是通过layout目录下...

3357
来自专栏androidBlog

ViewPager,ScrollView 嵌套ViewPager滑动冲突解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

733
来自专栏battcn

一起学设计模式 - 备忘录模式

备忘录模式又叫做快照模式(Snapshot Pattern),一个用来存储另外一个对象内部状态的快照的对象。

904
来自专栏技术与生活

设计模式-备忘录模式

备忘录角色对如何其他对象提供一个接口,也就是宽接口的话,那么备忘录角色存储的内部状态都暴露给其他对象。这种情况导致发起人的状态都没看到,是破坏封装性的,只能通过...

772
来自专栏上善若水

035android初级篇之[转]android的ViewGroup与View

Android中的View包含了用户交互和显示,类似于Windows操作系统中的window。

613
来自专栏非著名程序员

Android 实现视屏播放器、边播边缓存功能、外加铲屎(IJKPlayer)

Android 实现视屏播放器与边播边缓存功能外加蹲坑铲屎(IJKPlayer) hello,大家好,我就是那个会掀桌子的话唠,刚刚结束两篇关于音频播放与录制的...

4849
来自专栏林冠宏的技术文章

一个难倒 3年 android开发经验 " 工程师 " 的 "bug"

  一个关于 imageView 设置 scaleType 的问题。   就在刚才 晚上9 点多的时候,我的一个外包伙伴发一个工程代码我,叫我去看下这样一个"b...

1779
来自专栏everhad

札记:android手势识别,MotionEvent

摘要 本文是手势识别输入事件处理的完整学习记录。内容包括输入事件InputEvent响应方式,触摸事件MotionEvent的概念和使用,触摸事件的动作分类、多...

2477
来自专栏Android开发与分享

【Android】打造下拉放大效果

2136
来自专栏向治洪

高仿今日头条(2)

接上一篇博客:http://blog.csdn.net/xiangzhihong8/article/details/51262939 这部分主要是实现频道管理页...

1846

扫码关注云+社区