2010-12-27 10 views
7

Uso WebView para mi aplicación Androind. Tengo un problema y solicito una solución de ayuda.El teclado en la entrada de texto HTML desaparece cuando WebView llama de nuevo a 'loadUrl'

Hay un campo de texto en la página HTML. Cuando se hace de 'enfoque' y luego me llaman

  mWebView.setFocusableInTouchMode(true); 

en código Java para que el Android teclado de software pop-up que me deje llave introducida.

El problema es que necesito utilizando multi-hilo para algunos procesos en Java y llame a

  mWebView.loadUrl(strJSCall); 

como de devolución de llamada para ejecutar la función de JavaScript, pero el teclado se oculta!

La forma en que lo intento es forzar que el teclado vuelva a mostrarse. Pero, ¿cómo puede el teclado mostrar siempre cuando se llama a 'loadUrl'? Dosis ¿Alguien tiene el mismo problema y lo resuelve ya?

Sinceramente, Jr.

+0

Tengo un problema similar en Android 3.0 (Zoom de Motorola). En otros dispositivos con Android 2.x funciona normalmente. ¿Encontraste una solución? –

Respuesta

2

que tienen el mismo problema y no han resuelto completamente todavía.

he podido forzar el teclado para mostrar después de llamar webView.loadUrl, primero debe averiguar si el teclado está mostrando, he usado una versión modificada de este How to check visibility of software keyboard in Android?

luego llamar

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(webview, InputMethodManager.SHOW_IMPLICIT); 

Pero si, como yo, tiene que comunicarse con JavaScript en WebView después de cada pulsación de tecla, este enfoque hace que el teclado parpadee mientras intenta animar hacia arriba y hacia abajo.
También omite algunas de las entradas dependiendo de qué tan rápido escriba.

5

El problema con loadUrl es que interrumpe el subproceso de IU y aún cierra el método de entrada. La única forma sólida de hacerlo es verificar qué es el cursor en la vista web y anular el comportamiento loadUrl predeterminado en su vista web.

Dentro de su vista web personalizado:

@Override 
public void loadUrl(String url) { 
    HitTestResult testResult = this.getHitTestResult(); 
    if (url.startsWith("javascript:)" && testResult != null && testResult.getType() == HitTestResult.EDIT_TEXT_TYPE) 
    { 
      //Don't do anything right now, we have an active cursor on the EDIT TEXT 
      //This should be Input Method Independent 
    } 
    else 
    { 
     super.loadUrl(url); 
    } 
} 

Esto evitará que el lado nativo de la carga de Javascript de disparar cuando se tiene el foco en un campo de texto en WebKit. No es perfecto, pero evita el lío de tratar de averiguar si su campo de texto es visible, ya sea por el cambio de tamaño de la WebView. La ejecución de Javascript en la vista web debería funcionar bien.

De nuevo, si necesita algo para actualizar mientras está escribiendo, es posible que tenga que encontrar otra forma para que Java se comunique con Javascript que no bloquea el hilo de la interfaz de usuario. Este es un problema difícil que aún no he resuelto correctamente todavía.

+0

Gracias por su respuesta. Anulo esta API pero usando la forma de "reflexión" para evitar la llamada a la función para ocultar el teclado virtual. –

+0

@Jr. ¿Podrías explicar qué es exactamente lo que has hecho para arreglar esto? Gracias. – Piotr

1

En Android, ejecutar javascript desde WebView es unidireccional: llamar a WebView.loadUrl ("javascript: sub (1,1)"); No puede obtener el valor de retorno directamente.

Hay una manera asíncrona para obtener el valor devuelto por una función JavaScript: How to get return value from javascript in webview of android?

Pero en la mayoría de los casos, necesitamos un método de sincronización en lugar de la forma asíncrona.Por ejemplo, mientras el evento click se pasa al método onTouch de Android WebView, queremos ejecutar un JavaScript para leer la información del elemento en la que se hizo clic.

me han tratado dos soluciones: variables 1. Uso de Java P/V para envolver un método de sincronización del asíncrono en adelante, la solución parece: How to get return value from javascript in webview of android?

La solución totalmente no está funcionando, ya que el método de espera bloqueará la ejecución de JavaScript y JavaScriptInterface. Entonces, si queremos obtener el resultado de un método js en un subproceso UI. no es posible.

  1. Utilice Java Reflection para obtener la interfaz nativa de stringByEvaluatingJavaScriptFromString. Exist stringByEvaluatingJavaScriptFromString for Android

funciona muy bien, lo único que tienen que cuidar es el método de reflexión inicial cuando la página carga acabada. Intenté inicializar la reflexión dentro del constructor de WebView, pero fallé. Creo que el constructor es un método asíncrono.

Cuestiones relacionadas