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 的类似物的主要内容,如果未能解决你的问题,请参考以下文章

Android:API 级别低于 21 的状态栏颜色更改

调用需要 API 级别 21(让 camera2 在低于 21 的设备上运行?)[重复]

如果 Android API 级别低于 26,如何将存储访问框架与 MediaMuxer 一起使用

针对特定 API 级别的自定义 Android/Flutter 版本

API 级别 9 及以上的 AndroidHttpClient 与 HttpUrlConnection

使用 Android MediaRecorder 暂停和恢复(API 级别 < 24)