WebView devuelve una ventana incorrecta.innerHeight

Tengo una aplicación que hace uso de la WebView de Android, así como algunos JavaScript. Cuando mi WebViewClient llama onPageFinished() , onPageFinished() mi JavaScript para ejecutar un método de inicialización. Mi JavaScript está habilitado y cargado antes de que me golpeó onPageFinished() .

En ese método JavaScript uso window.innerWidth . Sin embargo, el valor que devuelve siempre es incorrecto y siempre el mismo. Independientemente de mi orientación, indica que el ancho interno es 320 y la altura interior es 240. (Los valores de anchura correctos para el retrato y el paisaje son 360 y 598, respectivamente.) En cualquier otro lugar window.innerWidth a window.innerWidth o window.innerHeight en JavaScript Un número exacto.

Lo que es más desconcertante es que si compruebo la altura o el ancho de la WebView directamente en mi llamada onPageFinished() usando

int height = view.getHeight();

int width = view.getWidth();

Entonces siempre devuelve correctamente (aunque devuelve los números de píxeles exactos, no el DIP). Esto me hace pensar que todo ha terminado de cargar con el WebView y por lo que no debería tener ningún problema en mi JavaScript.

¿Alguna idea sobre lo que esta pasando?

¡Gracias por adelantado!

Esto se debe a que Javascript se ejecuta antes de la inicialización relacionada con View de WebView. Y WebView de Android devuelve un valor predeterminado de 320×240 a JS. Ejecutar su JS después de algún tiempo está bien, como este

 function go() { int height = view.getHeight(); int width = view.getWidth(); }; window.setTimeout(go, 300); 

Al final utilicé los valores de webView.getHeight() y webView.getWidth() , los webView.getWidth() a la densidad de la pantalla y los pasé como argumentos a un método javascript a través de webView.loadUrl() . Esta era la única manera que podía estar seguro de que estaba recibiendo los valores correctos.

Hacer lo que se sugirió en los comentarios anteriores, comprobar el ancho de 320 y la altura de 240 funcionará muy bien … hasta que se ejecute en un dispositivo con esas dimensiones exactas.

Después de leer, se ha producido otra solución. En código java, podemos usar

 new Handler().post(new Runnable(){ @Override public void run(){ webview.loadUrl("...") } }); 

Añadirlo a QueueMessage y retrasar el js para ejecutar, y funciona.

Utilicé esto:

Java code in Activity :

 webView.addJavascriptInterface(new WebAppInterface(this), "Android"); 

 public class WebAppInterface { Context mContext; WebAppInterface(Context c) { mContext = c; } public int getWinHeight() { return webView.getHeight(); } } 

Código JS :

 var winHeight = Android.getWinHeight(); 
  • API de notificación en el navegador Chrome de Android
  • Meteor: ANDROID_HOME no está establecido aunque esté configurado
  • La fecha de Javascript no es válida en iOS
  • Activa Google Maps desde el navegador de Android
  • La forma JQUERY Mobile salta al introducir valores
  • ¿Cómo comunicarse entre WebView y JavaScript?
  • Cómo cambiar el tamaño de un elemento de Java Script para que se ajuste a su ventana de contenedor
  • ¿Cómo aumentar la velocidad de carga de audio con JavaScript?
  • Soporte de selector de archivos en el teléfono para ios y Android
  • Desplazamiento automático hacia la vista de la entrada de enfoque
  • Detectar si el cliente permite la reproducción de medios en línea para vídeo HTML5
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.