¿Cómo puedo obtener el evento onclick en la vista web en Android?

Quiero saber cuándo el usuario hace clic en la vista web, pero no en un hipervínculo. En ese clic, quiero mostrar / ocultar una vista de mi actividad que contiene una vista web. ¿Cualquier sugerencia?

OnClickListener un vistazo a esto y descubrí que un WebView no parece enviar eventos de clics a OnClickListener . Si alguien puede probar que estoy equivocado o decirme por qué, entonces me gustaría escucharlo.

Lo que encontré es que un WebView enviará eventos táctiles a un OnTouchListener . Tiene su propio método onTouchEvent , pero parece que solo MotionEvent.ACTION_MOVE con ese método.

Entonces, dado que podemos obtener eventos en un detector de eventos táctiles registrado, el único problema que queda es cómo eludir cualquier acción que desee realizar para un toque cuando el usuario hace clic en una URL.

Esto se puede lograr con un trabajo de pies de Handler elegante enviando un mensaje retrasado para el toque y luego eliminando esos mensajes táctiles si el toque fue causado por el usuario al hacer clic en una URL.

Aquí hay un ejemplo:

 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; } } 

Espero que esto ayude.

Puede implementar un OnClickListener a través de OnTouchListener:

 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; } }); 

La solución de Hamidreza casi funcionó para mí.

Observé por experimentación que un simple toque generalmente tiene 2-5 movimientos de movimiento de acción. Verificar el tiempo entre la acción hacia abajo y hacia arriba fue más simple y se comportó más como lo que esperaba.

 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; } 

Evento de Click en webView funciona en onTouch como este:

 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; } }); 

Creo que también puedes usar el estado MotionEvent.ACTION_UP, ejemplo:

 @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; } 

Esto funciona para mí

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

WebViewClient.shouldOverrideUrlLoading podría ser útil. Estamos teniendo un requisito similar en una de nuestras aplicaciones. No intentado todavía.

Eso es porque está vinculado a la vista web, no al botón. Tuve el mismo problema después de la implementación. El botón no tuvo ningún efecto, pero sí la página en la vista web.