记录下帮助一位网友解决的关于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 条评论
登录 后参与评论

相关文章

来自专栏小鄧子的技术博客专栏

【译】Android技术栈,1#架构

本文是如何开发一款具有扩展性,维护性和测试性的Android应用专题的第一篇。本专题将会涉及到一些设计模式和类库的使用方式,减少Android Develope...

1113
来自专栏数据和云

更新通报:Oracle全面修正了关于DB Link和SCN补丁的公告

前情回顾,请参考之前的文章: 预警揭秘:倒计时炸弹11.2.0.4前版本DB Link必须在2019年4月升级真相 解决方案:Oracle的 DB Link 问...

4268
来自专栏何俊林

Android Multimedia框架总结(十八)Camera2框架从Java层到C++层类关系

好,正文开始,Camera2框架,是对Camera更灵活,在很多命名上,Google都用Camera2,如Camera2Client,说明,这是一次大的改动。否...

3406
来自专栏技术小黑屋

程序实现自己管理数据清理工作

How to disable system clear button and replace it with self application Manage S...

1611
来自专栏Android开发指南

7.xmpp版即时聊天

5516
来自专栏开发之途

Android 微信分享与QQ分享功能

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

Android 基于 Speex 的高度封装语音库,0 耦合,没三方jar包

为了避免大家浪费时间,直接先看下面的 截图,看完后,若你觉得会需要到,那么就请听我继续。

1993
来自专栏郭霖

Android提醒微技巧,你真的了解Dialog、Toast和Snackbar吗?

今天给大家带来一篇简单易懂的微技巧文章,并没有什么高深的技术点,但重点仍然是在细节,相信还是可以给不少朋友带来帮助的。 Dialog和Toast所有人肯定都不会...

2228
来自专栏孟磊的专栏

React Native 按需加载 手 Q 狼人杀探索之路

最近特别火的狼人杀和最近特别火的 React Native 会擦出什么样的火花呢?本文和您一同探讨 RN 性能优化的现实场景。

9131
来自专栏一个会写诗的程序员的博客

《Kotlin 程序设计》第十四章 使用Kotlin开发Android程序

https://github.com/EasyKotlin/Kotlin-for-Android-Developers

1152

扫码关注云+社区

领取腾讯云代金券