En el navegador, puede hacer clic largo en las URL. En mi WebView, no puedes. ¿Cómo puedo hacerlo para que puedas?Habilite longClick en WebView
Respuesta
Tuve este mismo problema.
Lamentablemente, no pude encontrar una manera de hacer aparecer las opciones de menú estándar del navegador. Tienes que implementar cada uno tú mismo. Lo que hice fue registrar el WebView para menús contextuales con activity.registerForContextMenu(webView)
. Entonces subclases la vista Web y hizo caso omiso de 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 quieres hacer algo más que un menú contextual, a continuación, utilizar un OnLongClickListener
. Sin embargo, si desea interceptar el evento de clic largo, el HitTestResult
es la clave. Eso es lo que le permitirá descubrir en qué hizo clic el usuario y hacer algo con él.
No he implementado realmente "Guardar enlace", lo acabo de incluir 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();
}
Habilitarí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
Alternativamente, es posible que desee iniciar el navegador real en lugar de utilizar una vista Web.
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://example.com"));
startActivity(intent);
¿Podré ver el menú estándar de Android utilizando el método de Javascript? –
¿Puedo seleccionar, elegir y guardar solo Guardar enlace? Además, ¿funcionará esto al usar un OvverideUrlLoading? –
No sé cómo abrir el menú estándar del navegador (a menos que inicie el navegador) – LatinSuD
Me gustaría pensar que podría utilizar algo como esto:
WebView yourWebView;
yourWebView.setLongClickable(true);
yourWebView.setOnLongClickListener(...);
Eso le debe permitir coger clics largos en la vista. Lo que haces después de eso ... ¡eso depende de ti!
¿Puedo ver el menú estándar de Android? ¿Puedo elegir y elegir y guardar solo Guardar enlace? –
Solo quería copiar los datos de URL en un clic largo.
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);
}
}
}
- 1. Habilite json_encode en PHP
- 2. Habilite URL sluggified en Django
- 3. Eclipse: habilite las aserciones
- 4. Soporte/complemento de evento LongPres/longclick en jQuery
- 5. ¿Usando longclick/taphold con Google Maps en jQuery Mobile?
- 6. El evento LongClick también desencadena el evento Click
- 7. SQL Server: habilite conexiones remotas sin SSMS
- 8. Habilite la opción HDR para UIImagePickerController
- 9. Spring Framework, habilite el método PUT
- 10. Android: Habilite la aceleración de hardware
- 11. Habilite --hyperlink-source para "cabal install"
- 12. Rubymine: habilite los números de línea
- 13. Escala WebView en Cocoa
- 14. NullPointerException en WebView (WebView.requestFocus())
- 15. para cuerdas en Webview
- 16. Android youtube en webview
- 17. set loadURLTImeOutValue en webview
- 18. Desplazamiento Webview en Viewpager
- 19. viewpager + webview, cómo detener webview cargando
- 20. Habilite simultáneamente la interfaz wifi y 3G en Android
- 21. Habilite MathJax en fuentes RSS para blogs de Wordpress
- 22. Habilite el depurador de javascript en el Inspector de página
- 23. Habilite ipfw en ubuntu. No se puede encontrar loader.conf
- 24. Habilite el TEMPLATE_STRING_IF_INVALID de django en un único método
- 25. Habilite el "error de interrupción" con xDebug en PHPStorm
- 26. Prevención del menú contextual predeterminado en longpress/longclick en el dispositivo móvil Safari (iPad/iPhone)
- 27. Html Audio en Android Webview
- 28. Dibujo WebView incrustado en ICS
- 29. Desactivando la autosugestión en WebView?
- 30. WebView y cookies en Android
No puedo probar este código todavía, porque estoy donde estoy, pero ¿tiene que escribir el código para esas opciones de menú? p.ej. Guardar enlace? Si es así, ¿cómo lo hiciste? –
Sí ... es realmente desafortunado, pero es la única forma en que he podido hacerlo. Añadiré más detalles a mi respuesta. –
Todo el motivo por el que decidí usar un webView fue porque el sitio web estaba marcando el referer y no pude falsificarlo con HttpClient. ¿Hay alguna forma de verificar la URL y abrirla con el navegador web o crear un menú contextual? –