studio propiedades example codigo android performance android-layout webview android-widget

propiedades - webview android studio 2018



¿Cómo reducir el tamaño de WebView dinámicamente según su contenido? (9)

Una explicación detallada del problema se puede entender a partir de esta pregunta ya que el usuario tenía una imagen añadida para explicarlo mejor.

Estoy cargando contenido Html en mi WebView. Mi diseño tiene muchas vistas y WebView se ubica dentro de ScrollView (según el requisito de diseño). No responda como - "Don''t put WebView inside ScrollView" . Sé que no es bueno poner WebView dentro de ScrollView, pero según los requisitos, necesito hacerlo.

Por lo tanto, tengo Fragmento izquierdo (que muestra elementos de la lista) y Fragmento derecho (que muestra los datos reflejados en la selección del elemento de la lista del Fragmento izquierdo). Ahora, antes que nada, cuando cargo contenido Html dentro de WebV, se muestra correcto. Después de eso, cuando actualizo WebView con nuevo contenido Html, aparece el problema.

Supongamos que mi primer contenido Html es de 100 líneas que muestra correctamente y luego recargo WebView con mi nuevo contenido Html que es de 40 líneas, luego el WebView no se reduce y se ajusta al contenido con 40 líneas, aún permanece tan largo como 100 líneas que muestran el espacio blanco / en blanco en la parte inferior.

Por lo tanto, parece que WebView puede cambiar el tamaño de menos contenido que previamente se cargó a más contenido, pero no puede cambiar el tamaño cuando el contenido es menor que el contenido previamente cargado.

Lo había intentado de muchas maneras

  • Agregar android:hardwareAccelerated="true" en Manifest
  • Este blog
  • También muchas otras formas y blog
  • También intenté usar mWebView.clearView(); lo que hace que cambie el tamaño de WebView, pero a veces el WebView comienza a parpadear, lo cual es molesto. Similar a este video

Pero, no pude encontrar una solución adecuada. Si alguno de ustedes tiene el mismo problema antes háganme saber la mejor solución que podría aplicar.

ACTUALIZAR -

Después de buscar en Google parece que este es un problema bien conocido en Honeycomb. Esta pregunta también indica un problema similar.


Este es un problema conocido con WebView y algunas soluciones disponibles no funcionan en todos los dispositivos.

Probé muchas soluciones en las respuestas de SO y también busqué en Internet, pero ninguna de ellas me funcionó.

Terminé, eliminando WebView y añadiendo WebView nuevamente en la misma posición en Diseño

Aquí está ese código de demostración,

final RelativeLayout rl = new RelativeLayout(this); myWebView = new WebView(this); myWebView.setBackgroundColor(Color.GRAY); myWebView.loadUrl("file:///android_asset/1.htm"); rl.addView(myWebView); // ******* Added At Index 0 Button btn = new Button(this); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { if (!flg) { rl.removeViewAt(0); myWebView = new WebView(MainActivity.this); myWebView.setBackgroundColor(Color.GRAY); myWebView.loadUrl("file:///android_asset/3.htm"); rl.addView(myWebView, 0, new RelativeLayout.LayoutParams( new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT))); flg = true; } else { rl.removeViewAt(0); myWebView = new WebView(MainActivity.this); myWebView.setBackgroundColor(Color.GRAY); myWebView.loadUrl("file:///android_asset/1.htm"); rl.addView(myWebView, 0, new RelativeLayout.LayoutParams( new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT))); flg = false; } } }); rl.addView(btn); // ******* Added At Index 1 setContentView(rl);


No lo he intentado, pero ¿por qué no pruebas al configurar los parámetros de weblayout nuevamente antes de cargar los nuevos contenidos? es decir, establecer la altura y el ancho para el contenido de pantalla. si el éxito se encuentra, por favor responde. si no encuentra el éxito mejor ir por javascipt


chicos, parece que encontré una solución para el contenido local. Debería simplemente llamar a webView.reload () antes de cargar contenido nuevo; de alguna manera cambia el tamaño sin parpadear.


Establecí la visibilidad de mi WebView en Gone y cargué el contenido en WebView mientras no está. Luego configuro la visibilidad como visible después de cargar DOM y JS y parece que dibuja la longitud correctamente. Como no hay una devolución de llamada como onPageFinished para determinar cuándo el JS ha terminado de ejecutarse, otorgo a WebView un retraso de un segundo antes de establecer la visibilidad en verdadero. Esta solución es suficiente para mis propósitos, ¡así que con suerte responde a las necesidades de algunos de ustedes!


Cada vez que creas un objeto de webview y das su param es un dolor, en su lugar puedes seguir los siguientes pasos y funcionará

  • pon un archivo html en blanco en la carpeta de assets y dale un nombre empty.html

  • llame a webview.loadUrl("file:///android_asset/empty.html");

  • ahora carga tu contenido

Webview reducirá su altura.

Asegúrate de no poner ningún contenido en empty.html


Aquí he cambiado la altura de la vista web dependiendo de la visualización del teclado.

activityRootView = (RelativeLayout) findViewById(R.id.webview1); mWebView = (WebViewEx) WebViewActivity.this.findViewById(R.id.webview); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { public void onGlobalLayout() { Rect r = new Rect(); //r will be populated with the coordinates of your view that area still visible. activityRootView.getWindowVisibleDisplayFrame(r); int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top); if(heightDiff != lastValue) { if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard... Log.i("Screen Size Changed","KeyBoard Displaying"+ r.bottom); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); params.height=r.bottom; mWebView.setLayoutParams(params); //appView.sendJavascript("onKeyBoardShow(" + r.bottom + ");"); } else { /// appView.sendJavascript("onKeyBoardHide();"); Log.i("Screen Size Changed","KeyBoard not displaying" +r.bottom); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); params.height=r.bottom; mWebView.setLayoutParams(params); } lastValue = heightDiff; } } });


Como señaló @Ankit, ir a una página vacía podría ayudar. "about: blank" es mejor, sin embargo.


Parece que no hay forma de cambiar el tamaño del WebView (disminuir) su tamaño dinámicamente una vez que esté cargado. Entonces, lo único que podría resolver mi problema era volver a cargar el WebView completo. Entonces, en lugar de definir el Fragmento en xml, cambié mis cosas agregando Fragment dinámicamente cada vez. Por lo cual pude resolver mi problema.

Espero que esto ayude a otros en el futuro!


Esto hace la magia! Dice

Propiedad de Android: android: layout_weight = "1 en el diseño debería funcionar ...

En mi caso, WebView está en RelativeLayout. Así que hacer thi android: layout_height = "wrap_content" funcionó como un encanto :)