阻止WebView抓取onClickListener

时间:2015-08-11 10:12:13

标签: android android-webview onclicklistener ontouchlistener

我知道这经常被问到,但所有解决方案(我发现)都不适合我。

我所拥有的是带有OnClickListener制作Toast(#toast1)的CardView。 在CardView内部,有多个视图和WebView。

正如其他地方所提到的,要通过WebView将点击传递给CardView,我已经完成了以下操作:

  • 在WebView XML中设置android:clickable="false"
  • CardView.setOnClickListener(...)下插入以下内容 WebView.setOnTouchListener( (view, event) -> true);

    我还用匿名方法替换了lambda,看看它是否就是这样。没有变化。

现在发生的事情是:

  • 在边框和其他视图上,触发clickListener并显示toast
  • 在webView上,clickListener未被触发。
  • 在返回true之前,还要在WebView的touchLstener中添加一个toast(#toast2),然后触发它。

我的期望:

  • 点击将通过WebView
  • 传递
  • 添加#toast2:首先显示#astast2然后#toast1

有点令人困惑的是,在OnTouchListener的文档中,回复如下:

  

如果监听器已经使用了该事件,则为true,否则为false。

对我来说意味着:

  • true:当听众消耗它时,不要点击下面的视图
  • false:点击下方视图,因为听众没有消费它

但设置为false并没有改变任何东西。

1 个答案:

答案 0 :(得分:7)

首先,我建议你熟悉android触摸处理系统 - 你可以在this answer找到一个非常好的描述。总结一下:触摸事件传播从层次结构的顶层开始,但触摸事件的实际处理从视图层次结构的最低层开始。至于您的问题的解决方案,我建议您以下列方式提升WebView的父级并覆盖onInterceptTouchEvent

@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
    return true;
}

这将指示此父视图拦截否则将转到其子视图的所有触摸事件,从而将第一级触摸处理限制为此视图。