API 级别低于 9 的 android:filterTouchesWhenObscured 的类似物
Posted
技术标签:
【中文标题】API 级别低于 9 的 android:filterTouchesWhenObscured 的类似物【英文标题】:Analogue of android:filterTouchesWhenObscured for API level below 9 【发布时间】:2012-06-15 16:22:47 【问题描述】:从 API 级别 9 开始,在 ViewGroup
上有 android:filterTouchesWhenObscured
属性和对应的 setFilterTouchesWhenObscured
方法。例如,当一个视图设置了onClickListener
并且另一个视图遮盖了该视图(例如,覆盖面板、吐司或其他任何东西),那么触摸将不会传递给被遮盖的视图 - 在我的示例中,onClick
将不要被解雇。
但是,这在 API 级别 7 中不可用 - 对于我的项目,要求是 Android 2.1 及更高版本,这意味着我必须使用级别 7。
有没有简单的解决方法?在第 7 级中,此属性本质上被硬编码为 FALSE。结果,我得到了这个奇怪的行为:在一个视图上,我有一个按钮。按下时,另一个视图滑入到位,用按钮覆盖视图。在这个视图中,有它自己的按钮,但它与下方按钮的位置不匹配。因此,如果用户在下方按钮所在的位置触摸覆盖面板,则该按钮的 onClick
将再次被触发 - 这不是我想要/需要的。
在这种情况下,我能做些什么来防止onClick
被触发?谢谢。
【问题讨论】:
【参考方案1】:事实证明,没有办法做到这一点。在 API 级别 9 之前的 Android 中,有两种方法可以解决该问题:
从底层视图中删除监听器(在我的例子中,我有大约十几个,我需要删除它们,然后在覆盖层再次不可见后重新设置);或
在整个叠加层上添加一个空的 onClickListener(即拦截 click
事件并且对其不执行任何操作) - 这就是我处理它的方式。
有趣的是,接收click
事件的模糊视图的行为在早期版本的 Android 中被报告为错误,但该错误已关闭表明它不是错误而是预期的功能(我看不到为什么有人会想要那个功能)。我想android:filterTouchesWhenObscured
属性是在级别 9 中添加的,以安抚所有不开心的开发人员:)
【讨论】:
2.是我处理这个案子的方式以上是关于API 级别低于 9 的 android:filterTouchesWhenObscured 的类似物的主要内容,如果未能解决你的问题,请参考以下文章
调用需要 API 级别 21(让 camera2 在低于 21 的设备上运行?)[重复]
如果 Android API 级别低于 26,如何将存储访问框架与 MediaMuxer 一起使用
针对特定 API 级别的自定义 Android/Flutter 版本