防止 WebView 抓取 onClickListener
Prevent WebView from grabbing onClickListener
我知道这个问题经常被问到,但所有解决方案(我发现)都不适合我。
我拥有的是带有 OnClickListener 的 CardView,用于制作 Toast (#toast1)。
在 CardView 内部有多个视图以及一个 WebView。
如其他地方所述,要将点击通过 WebView 传递到 CardView,我已完成以下操作:
- 在 WebView 中设置
android:clickable="false"
XML
在 CardView.setOnClickListener(...)
下插入以下内容
WebView.setOnTouchListener( (view, event) -> true);
我也用匿名方法替换了lambda,看看是不是就是这个。没有变化。
现在发生的事情是:
- 在边框和其他视图上方,触发 clickListener 并出现 toast
- 在 webView 上,没有触发 clickListener。
- 在 returning
true
之前,在 WebView 的 touchLstener 中添加一个 toast (#toast2),它会被触发。
我的期望:
- 点击会通过WebView
- 添加了#toast2:首先显示#toast2,然后显示#toast1
有点令人困惑的是,在 OnTouchListener 的文档中,return 如下:
True if the listener has consumed the event, false otherwise.
对我来说这意味着:
true
:不要将点击传递给以下视图,因为听众会使用它
false
:将点击传递到下面的视图,因为听众没有使用它
但是设置为 false 并没有改变任何东西。
首先,我建议您熟悉 android 触摸处理系统 - 您可以在 this answer 中找到非常好的描述。总结一下:触摸事件传播从层次结构的顶层开始,但触摸事件的实际处理从视图层次结构的最低级别开始。至于你的问题的解决方案,我可能会建议将你的 WebView
的父类子类化并按以下方式覆盖 onInterceptTouchEvent
:
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
return true;
}
这将指示此父视图拦截所有将转到其子视图的触摸事件,从而将第一级触摸处理限制到此视图。
我知道这个问题经常被问到,但所有解决方案(我发现)都不适合我。
我拥有的是带有 OnClickListener 的 CardView,用于制作 Toast (#toast1)。 在 CardView 内部有多个视图以及一个 WebView。
如其他地方所述,要将点击通过 WebView 传递到 CardView,我已完成以下操作:
- 在 WebView 中设置
android:clickable="false"
XML 在
CardView.setOnClickListener(...)
下插入以下内容WebView.setOnTouchListener( (view, event) -> true);
我也用匿名方法替换了lambda,看看是不是就是这个。没有变化。
现在发生的事情是:
- 在边框和其他视图上方,触发 clickListener 并出现 toast
- 在 webView 上,没有触发 clickListener。
- 在 returning
true
之前,在 WebView 的 touchLstener 中添加一个 toast (#toast2),它会被触发。
我的期望:
- 点击会通过WebView
- 添加了#toast2:首先显示#toast2,然后显示#toast1
有点令人困惑的是,在 OnTouchListener 的文档中,return 如下:
True if the listener has consumed the event, false otherwise.
对我来说这意味着:
true
:不要将点击传递给以下视图,因为听众会使用它false
:将点击传递到下面的视图,因为听众没有使用它
但是设置为 false 并没有改变任何东西。
首先,我建议您熟悉 android 触摸处理系统 - 您可以在 this answer 中找到非常好的描述。总结一下:触摸事件传播从层次结构的顶层开始,但触摸事件的实际处理从视图层次结构的最低级别开始。至于你的问题的解决方案,我可能会建议将你的 WebView
的父类子类化并按以下方式覆盖 onInterceptTouchEvent
:
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
return true;
}
这将指示此父视图拦截所有将转到其子视图的触摸事件,从而将第一级触摸处理限制到此视图。