11
dominio

Problema: lector de formato ePub basado en Android WebView -Android 3.x SÓLO WebView selección de texto + JavaScript

Necesitamos más destacado de texto que se puede acceder a través de métodos de JavaScript (es decir, convertir em en, a su vez em off, guardarlos enviarlas por correo electrónico, etc.)

Cualquier persona en el saber, por favor, corríjanme si me equivoco: Durante la selección del texto en una vista Web -

Básicamente estamos presentaron una superposición de Vista de texto (WebTextView), que no es en absoluto MANERA unida al html subyacente que no sea visualmente (buen trabajo al alinearlo todo y hacerlo sin interrupciones, por cierto), o n en el que realizamos TextSelectionActionMode y ClipboardManager se suministra con los resultados ... para dejarlo claro, el HTML real con WebView NO se selecciona en realidad en ningún momento durante este proceso de inventario, por lo que JavaScript no puede acceder a los resultados de la acción.

Para hacer que este comportamiento funcione en 3.1+, tengo algunos posibles planes para implementar mi propia selección en una WebView: esta es la parte en la que me pregunto si no puedo ver fuera de mi corner :) -

1) captura MOTION_DOWN del clic largo que inicia el modo de selección, anula el modo de acción TextSelection incorporado (para proporcionar a los clientes la marca - la forma en que lo hice es tan hackish que duele) arrastre, capture la posición MOTION_UP, asigne estos coords al WebView, y realice mi selección en función de los coords (mientras compara el texto con el capturado por el ClipboardManager)

2) crear mi propia "WebTextView" (toda la lotta work jajaja) y no tan hackosamente crear mi propio ActionMode y hacer todo lo anterior.

3) utilice los MotionEvents generados por el proceso de selección de valores y anule de algún modo el stock Action Mode de selección de acciones provocado por este.

Estas son las opciones que veo, con suerte mi proximidad y frustración con esto me han cegado a una solución más simple (léala como incorporada) o dos.

Gracias de nuevo por su tiempo.

Respuesta

1

No estoy 100% seguro de qué métodos/propiedades le otorgan el Rango y la Selección. No vi ninguno en la documentación. Pero pude obtener el rango seleccionado en píxeles usando la reflexión. No estoy seguro si esto ayuda a alguien, pero pensé que valía la pena publicarlo aquí.

Region result = null; 
try { 
    Object[] params = null; 

    Method nativeGetSelectionRegion = WebView.class.getDeclaredMethod("nativeGetSelectionRegion"); 
    nativeGetSelectionRegion.setAccessible(true);  
    result = (Region)nativeGetSelectionRegion.invoke(this, params); 


    Log.i(TAG, "res: region " + result.getBounds().toShortString()); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

Esperemos que ayuda a alguien

EDIT: Esto no funciona en 3.1 +

+0

confiar en la reflexión es doloroso, por decir lo menos ... confiar en javascript es igualmente doloroso (como ahora sé, mi solución está rota en WebView 4.0, trabajando en el "cómo" mientras escribo) en Javascript, document.getSelection() devuelve el objeto Selection, desde el cual puede recopilar la ubicación real en términos de documento https://developer.mozilla.org/en/DOM/window.getSelection (se aplica a la interfaz de documento o ventana) No confiaría en nada derivado de la reflexión en el mundo de Android; simplemente, lo romperán. Dicho todo esto, ¡ese es un buen plan de copia de seguridad si fallara el javascript! – Dan

+0

¿Cómo está activando ese document.getSelection()? Intentémoslo originalmente y descubrimos que cargar javascript a través de loadUrl ("javascript: document.getSelection()"); causó que la selección se borrara por lo que no había nada allí. – smokingoyster

+0

tiene que hacer el trabajo pesado dentro de la vista web con javascript, y devolver una Cadena (en mi caso) delimitada por tuberías con los datos pertinentes que está buscando. es decir, utilice JavaScriptInterface como receptor para el objeto de selección "aplanado" que se genera dentro de javascript. Además, dependiendo de lo que esté haciendo con esa información (utilicé la mía para la selección en tiempo real), tenga en cuenta que la entrega al subproceso de la interfaz de usuario será necesaria (ya que probablemente NO se encuentre en el subproceso de interfaz de usuario). por lo que un patrón de Handler puede ser, bueno, útil ... – Dan

11

Tengo este trabajo en el punto 2.2 - 4.0.3. Usé una interfaz de JavaScript y le pasé todos los toques. La solución parece funcionar bastante bien y he puesto un proyecto de ejemplo en github. El proyecto github incluye el js necesario en la carpeta de activos, así como una página de prueba y una vista web que carga la página de prueba e implementa todos los métodos necesarios para manejar la selección. El enlace al proyecto github es https://github.com/btate/BTAndroidWebViewSelection. Tienen en él.

+0

Agradable, no pude usar las diversas bibliotecas JS debido a la velocidad al cargar páginas HTML grandes (específicas para nuestras aplicaciones), así que terminé escribiendo el js desde cero. – Dan

+0

Gracias por publicar esto en GitHub, btate. – mikejonesguy

+3

@btate sobre el proyecto github no funciona para OS versión 4.1 +. – sachin003

Cuestiones relacionadas