我怎样才能得到Android上的WebView onclick事件?

我想知道用户何时点击webview,而不是超链接。 在那个点击我想显示/隐藏我的活动持有一个web视图的视图。 任何build议?

我看了一下,发现一个WebView似乎没有发送点击事件到一个OnClickListener 。 如果有人可以certificate我错了,或者告诉我为什么然后我有兴趣听到它。

我find的是一个WebView将触发事件发送到一个OnTouchListener 。 它有自己的onTouchEvent方法,但我似乎只使用该方法得到onTouchEvent

所以考虑到我们可以在已注册的触摸事件监听器上获取事件,唯一的问题是如何绕过用户点击某个URL时想要执行的任何操作。

这可以通过一些奇特的Handler步法来实现,通过发送延迟的消息来触摸,然后如果触摸是由用户点击URL引起的,则移除这些触摸消息。

这是一个例子:

 public class WebViewClicker extends Activity implements OnTouchListener, Handler.Callback { private static final int CLICK_ON_WEBVIEW = 1; private static final int CLICK_ON_URL = 2; private final Handler handler = new Handler(this); private WebView webView; private WebViewClient client; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.web_view_clicker); webView = (WebView)findViewById(R.id.web); webView.setOnTouchListener(this); client = new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { handler.sendEmptyMessage(CLICK_ON_URL); return false; } }; webView.setWebViewClient(client); webView.setVerticalScrollBarEnabled(false); webView.loadUrl("http://www.example.com"); } @Override public boolean onTouch(View v, MotionEvent event) { if (v.getId() == R.id.web && event.getAction() == MotionEvent.ACTION_DOWN){ handler.sendEmptyMessageDelayed(CLICK_ON_WEBVIEW, 500); } return false; } @Override public boolean handleMessage(Message msg) { if (msg.what == CLICK_ON_URL){ handler.removeMessages(CLICK_ON_WEBVIEW); return true; } if (msg.what == CLICK_ON_WEBVIEW){ Toast.makeText(this, "WebView clicked", Toast.LENGTH_SHORT).show(); return true; } return false; } } 

希望这可以帮助。

您可以通过OnTouchListener实现一个OnClickListener:

 webView.setOnTouchListener(new View.OnTouchListener() { public final static int FINGER_RELEASED = 0; public final static int FINGER_TOUCHED = 1; public final static int FINGER_DRAGGING = 2; public final static int FINGER_UNDEFINED = 3; private int fingerState = FINGER_RELEASED; @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: if (fingerState == FINGER_RELEASED) fingerState = FINGER_TOUCHED; else fingerState = FINGER_UNDEFINED; break; case MotionEvent.ACTION_UP: if(fingerState != FINGER_DRAGGING) { fingerState = FINGER_RELEASED; // Your onClick codes } else if (fingerState == FINGER_DRAGGING) fingerState = FINGER_RELEASED; else fingerState = FINGER_UNDEFINED; break; case MotionEvent.ACTION_MOVE: if (fingerState == FINGER_TOUCHED || fingerState == FINGER_DRAGGING) fingerState = FINGER_DRAGGING; else fingerState = FINGER_UNDEFINED; break; default: fingerState = FINGER_UNDEFINED; } return false; } }); 

Hamidreza的解决scheme几乎为我工作。

我从实验中注意到,一个简单的敲击通常有2-5个动作移动事件。 检查行动之间的时间更简单,performance得更像我所期望的。

 private class CheckForClickTouchLister implements View.OnTouchListener { private final static long MAX_TOUCH_DURATION = 100; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: m_DownTime = event.getEventTime(); //init time break; case MotionEvent.ACTION_UP: if(event.getEventTime() - m_DownTime <= MAX_TOUCH_DURATION) //On click action break; default: break; //No-Op } return false; } 

我想你也可以使用MotionEvent.ACTION_UP状态,例如:

 @Override public boolean onTouch(View v, MotionEvent event) { switch (v.getId()) { case R.id.iv: if (event.getAction() == MotionEvent.ACTION_UP) { if (isheadAndFootShow == false) { headLayout.setVisibility(View.VISIBLE); footLayout.setVisibility(View.VISIBLE); isheadAndFootShow = true; } else { headLayout.setVisibility(View.INVISIBLE); footLayout.setVisibility(View.INVISIBLE); isheadAndFootShow = false; } return true; } break; } return false; } 

这对我有用

 webView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // Do what you want return false; } }); 

在点击事件在webView在这样的onTouch中工作:

 imagewebViewNewsChart.setOnTouchListener(new View.OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction()==MotionEvent.ACTION_MOVE){ return false; } if (event.getAction()==MotionEvent.ACTION_UP){ startActivity(new Intent(this,Example.class)); } return false; } }); 

WebViewClient.shouldOverrideUrlLoading可能会有所帮助。 我们的应用程序中有一个类似的要求。 还没有尝试过。

那是因为它绑定到web view而不是button。 实施后,我遇到了同样的问题。 该button没有影响,但网页视图中的页面做了。