2011-02-03 15 views
25

Tengo problemas para obtener la selección de una WebView en Android.Android WebView Javascript getSelection

Puedo obtener el WebView para pasar al modo de selección. Incluso puedo obtenerlo para copiar el texto al ClipBoard. Pero lo que realmente quiero hacer es resaltar la selección de forma permanente.

Así que la idea es poner WebView en el modo de selección. Permita que el usuario seleccione el texto y luego encienda algo para resaltar ese texto. Puedo hacer que funcione obteniendo el texto seleccionado del portapapeles, y luego buscarlo en Javascript y resaltarlo. El problema ocurre cuando el usuario selecciona una palabra común real. Tengo que resaltarlos a todos o de alguna manera averiguar dónde está la selección para obtener la correcta.

He intentado este JavaScript que funciona en el iPhone. Bu getSelection() no parece funcionar en Android.

function highlight(colour) { 
    var range, sel; 
    if (window.getSelection) { 
      // Non-IE case 
     sel = window.getSelection(); 
     if (sel.getRangeAt) { 
      range = sel.getRangeAt(0); 
     } 
     document.designMode = "on"; 
     if (range) { 
      sel.removeAllRanges(); 
      sel.addRange(range); 
     } 
      // Use HiliteColor since some browsers apply BackColor to the whole block 
     if (!document.execCommand("HiliteColor", false, colour)) { 
      document.execCommand("BackColor", false, colour); 
     } 
     document.designMode = "off"; 
    } else if (document.selection && document.selection.createRange) { 
      // IE case 
     range = document.selection.createRange(); 
     range.execCommand("BackColor", false, colour); 
    } 
} 

¿Alguna sugerencia?

+0

¿Cómo se llega a copiar el texto en el portapapeles? ¿Lo hace programáticamente o cuenta con que el usuario haga la selección manualmente? –

Respuesta

0

Debería probar rangy - Un rango de JavaScript entre exploradores y biblioteca de selección.

+0

cómo usarlo en Android – Ravi

+0

@Dainel del mismo modo que lo usa en cualquier otra plataforma: rangy es solo un conjunto de archivos JavaScript. – spektom

+0

en android getSelection() no devuelve nada, ¿es posible ser rancio? – Ravi

9

Cuando WebView entra en "Modo de selección", WebView no se está utilizando para la selección ... Se está presionando bajo una "WebTextView" (clase privada en el arsenal de Android) que imita la posición del texto, pero permite imágenes para mostrar, y le permite "seleccionar" el texto que aparece en el HTML real. El problema surge cuando intentas interactuar con WebView después de "seleccionar" el texto. Los controles de resaltado y cursor están en la posición correcta, pero en realidad se encuentran en el WebTextView especial que mencioné, por lo tanto, en realidad no tiene una selección para obtener a través de getSelection de JavaScript o cualquier otro medio en JavaScript. Estoy trabajando para hacer ACTION_DOWN (de LongPress) que desencadena la selección y el arrastre y ACTION_UP del lanzamiento del arrastre para mí a través de JavaScript, pero es muy peludo y para nada amigable para el usuario en este punto ...

http://www.java2s.com/Open-Source/Android/android-core/platform-frameworks-base/android/webkit/WebTextView.java.htm

verificación de la fuente (que es mucho trabajo para imitar la selección de texto en lugar de proporcionarla) es triste, y en la actualidad muy doloroso para un proyecto nuestro equipo ha llevado a cabo - sobre todo después de hacer lo mismo aplicación para iPad ...

+0

¿Algún progreso en esto? ¿Cómo se obtiene una instancia de WebTextView para la selección? – Brian

+0

No puedes. Es un intérprete de comandos para proporcionar el texto que vive en WebView, pero no para acceder a la WebView en sí ... http: // stackoverflow.com/questions/6948447/android-3-0-webview-text-selection-javascript Utilicé Java para capturar movimiento durante un proceso de selección y JavaScript para habilitar la selección dentro de la propia WebView. – Dan

+0

Dan por favor envíeme un código Necesito la identificación y el nombre de la etiqueta de la palabra seleccionada en webview – Ravi

2

Finalmente, en Android 4.4 KitKat, WebView ahora está basado en Chromium.

Por lo tanto, tenemos acceso a window.getSelection() !!

wv.evaluateJavascript("console.log(window.getSelection().baseNode.nodeValue);", null); 

probado en Nexus 5 & Nexus 7.

+0

Si utiliza 'evaluateJavascript' por qué no utilizar el valor de retorno de' ValueCallback'? 'EvaluateJavascript ("(function() {return window.getSelection(). BaseNode.nodeValue})()", nuevo ValueCallback () { @ Override public void onReceiveValue (Valor de la cadena) { Log.v (TAG, "SELECCIÓN:" + valor); } }); } ' – Stan