Habilite longClick en WebView

En el navegador, puede hacer clic largo en las URL. En mi WebView, no puedes. ¿Cómo puedo hacerlo para que puedas?

Yo tuve el mísmo problema.

Lamentablemente, no pude encontrar la manera de que aparezcan las opciones estándar del menú del navegador. Tienes que implementar cada uno tú mismo. Lo que hice fue registrar WebView para menús contextuales con activity.registerForContextMenu(webView) . Luego subclasé el WebView y anulé este método:

 @Override protected void onCreateContextMenu(ContextMenu menu) { super.onCreateContextMenu(menu); HitTestResult result = getHitTestResult(); MenuItem.OnMenuItemClickListener handler = new MenuItem.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { // do the menu action return true; } }; if (result.getType() == HitTestResult.IMAGE_TYPE || result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { // Menu options for an image. //set the header title to the image url menu.setHeaderTitle(result.getExtra()); menu.add(0, ID_SAVEIMAGE, 0, "Save Image").setOnMenuItemClickListener(handler); menu.add(0, ID_VIEWIMAGE, 0, "View Image").setOnMenuItemClickListener(handler); } else if (result.getType() == HitTestResult.ANCHOR_TYPE || result.getType() == HitTestResult.SRC_ANCHOR_TYPE) { // Menu options for a hyperlink. //set the header title to the link url menu.setHeaderTitle(result.getExtra()); menu.add(0, ID_SAVELINK, 0, "Save Link").setOnMenuItemClickListener(handler); menu.add(0, ID_SHARELINK, 0, "Share Link").setOnMenuItemClickListener(handler); } } 

Si desea hacer algo más que un menú contextual, utilice OnLongClickListener . Sin embargo, si desea interceptar el evento de clic largo, HitTestResult es la clave. Eso es lo que le permitirá descubrir en qué hizo clic el usuario y hacer algo con él.

En realidad, no he implementado “Guardar enlace”, solo lo incluí como ejemplo aquí. Pero para hacerlo, tendrías que hacer todo el proceso tú mismo; Tendría que hacer una solicitud HTTP GET, recibir la respuesta y luego almacenarla en algún lugar de la tarjeta SD del usuario. No hay manera de que yo sepa de invocar directamente la actividad de descarga de la aplicación del navegador. Su código “Guardar enlace” se verá algo como esto:

 HitTestResult result = getHitTestResult(); HttpClient httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet(result.getExtra()); HttpResponse response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); if (entity != null) { URL url = new URL(result.getExtra()); //Grabs the file part of the URL string String fileName = url.getFile(); //Make sure we are grabbing just the filename int index = fileName.lastIndexOf("/"); if(index >= 0) fileName = fileName.substring(index); //Create a temporary file File tempFile = new File(Environment.getExternalStorageDirectory(), fileName); if(!tempFile.exists()) tempFile.createNewFile(); InputStream instream = entity.getContent(); BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); //Read bytes into the buffer ByteArrayBuffer buffer = new ByteArrayBuffer(50); int current = 0; while ((current = bufferedInputStream.read()) != -1) { buffer.append((byte) current); } //Write the buffer to the file FileOutputStream stream = new FileOutputStream(tempFile); stream.write(buffer.toByteArray()); stream.close(); } 

Creo que podrías usar algo como esto:

 WebView yourWebView; yourWebView.setLongClickable(true); yourWebView.setOnLongClickListener(...); 

Eso debería permitirle hacer largos clics en la vista. Lo que haces después de eso … ¡eso depende de ti!

Permitiría Javascript en la vista web. Luego use onMouseDown () y onMouseUp () para determinar la duración del clic.

También puede crear menús emergentes en Javascript (no en los menús estándar, sino en los suyos propios).

Finalmente puede interactuar entre Javascript y su código Android / Java.

Ejemplo de interacción simple entre Javascript y una aplicación de Android.

http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/assets/demo.html

http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/src/com/google/android/webviewdemo/WebViewDemo.java


Alternativamente, es posible que desee iniciar un navegador real en lugar de utilizar un WebView.

 Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://example.com")); startActivity(intent); 

Solo quería copiar los datos de URL con un clic prolongado.
Al tomar como referencia la respuesta aceptada, escribí esto.

  registerForContextMenu(webView); @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); WebView webView = (WebView) v; HitTestResult result = webView.getHitTestResult(); if (result != null) { if (result.getType() == HitTestResult.SRC_ANCHOR_TYPE) { String linkToCopy = result.getExtra(); copyToClipboard(linkToCopy, AppConstants.URL_TO_COPY); } } }