Cómo reducir el tamaño de WebView dinámicamente de acuerdo a su contenido?

Una explicación detallada del problema se puede entender a partir de esta pregunta, ya que el usuario había añadido imagen para explicar mejor.

Estoy cargando contenido Html en mi WebView. Mi diseño tiene muchas vistas y WebView está dentro de ScrollView (según el requisito de diseño). Por favor, no responda como: "Don't put WebView inside ScrollView" . Sé que no es una buena cosa para poner WebView dentro de un ScrollView, pero como por requisito tengo que hacerlo.

Por lo tanto, he dejado el fragmento (que muestra los elementos de la lista) y el fragmento de la derecha (mostrando los datos reflejados en la selección del elemento de lista del fragmento izquierdo). Ahora, en primer lugar cuando carga contenido Html dentro de WebV muestra correcta. Después de que cuando actualice WebView con nuevo contenido Html el problema ocurre.

Supongo que mi primer contenido Html es de 100 líneas que muestra correctamente y luego vuelvo a cargar WebView con mi nuevo contenido Html que es de 40 líneas, entonces el WebView no se encoge y se ajusta al contenido con 40 líneas, todavía sigue siendo tan largo como 100 Líneas que muestran blanco / espacio en blanco en la parte inferior.

Por lo tanto, parece que WebView es capaz de cambiar de tamaño a partir de menos contenido que previamente se ha cargado a más contenido, pero no puede volver a tamaño propio cuando el contenido es menor que el contenido cargado anteriormente.

Había intentado muchas maneras,

  • Añadiendo android:hardwareAccelerated="true" en Manifest
  • Este blog
  • También muchas otras maneras y blog
  • También había intentado usar mWebView.clearView(); Que hace que volver a tamaño el tamaño de WebView, pero a veces el inicio de WebView parpadeo que es sólo molesto. Similar a este video

Pero, no pudo encontrar ninguna solución adecuada. Si cualquiera de ustedes tiene el mismo problema antes de dejarme saber la mejor solución que podría aplicar.

ACTUALIZACIÓN –

Después de seguir buscando en Google parece que este es un problema muy conocido en Honeycomb. Esta pregunta también indica la cuestión similar.

9 Solutions collect form web for “Cómo reducir el tamaño de WebView dinámicamente de acuerdo a su contenido?”

Parece que no hay manera de redimensionar el tamaño de WebView (disminuir) dinámicamente una vez que esté cargado. Por lo tanto, lo único que podía resolver mi problema era recargar el WebView completo. Así que, en lugar de definir el Fragmento en xml cambié mis cosas añadiendo Fragmento dinámicamente cada vez. Por el cual pude resolver mi problema.

Espero que esto ayude a otros en el futuro!

Este es un problema conocido con WebView y alguna solución disponible no funciona en todos los dispositivos.

He intentado muchas soluciones dadas en respuestas SO y también buscado a través de Internet, pero ninguno de ellos trabajó para mí también.

Terminé, la eliminación de la WebView y la adición de la WebView de nuevo en la misma posición en el 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); 

Chicos, parece que encontré una solución para el contenido local. Usted debe llamar a webView.reload () antes de cargar nuevo contenido – de alguna manera hace el cambio de tamaño sin ningún parpadeo.

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 haciendo el android: layout_height = "wrap_content" funcionó como un encanto 🙂

No lo he intentado, pero ¿por qué no dar un intento por la configuración weblayout params de nuevo, antes de u cargar el nuevo contenido. Es decir, ajustar la altura y el ancho a wrapcontent. Si el éxito encontrado satisface responde. Si no encuentra éxito mejor ir para javascipt

He establecido la visibilidad de mi WebView a Gone, y cargar el contenido en el WebView mientras se ha ido. Entonces fijé la visibilidad a visible después de dejar el DOM y la carga de JS y parece dibujar la longitud correctamente. Dado que no hay una devolución de llamada como onPageFinished para determinar cuándo el JS ha terminado de ejecutar, le doy al WebView un segundo de retraso antes de establecer la visibilidad a true. Esta solución es suficiente para mis propósitos, así que espero que se ocupe de las necesidades de algunos de ustedes!

Cada vez que crear un objeto de webview y dar su param es un dolor en su lugar puede hacer los siguientes pasos y que funcionará

  • Poner un archivo html en blanco en la carpeta de assets y darle un nombre empty.html

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

  • Ahora cargue su contenido.

Webview reducirá su altura.

Asegúrese de que no está poniendo ningún contenido en empty.html

Aquí he cambiado la altura de la webview dependiendo de la pantalla del teclado virtual

  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 @Ankit señaló, ir a una página vacía podría ayudar. "About: blank" es mejor, sin embargo.

  • ¿Es posible obtener datos de formularios HTML en android mientras se usa webView?
  • Reproducción de vídeo local en WebView en Android
  • Método restorePicture de WebView - Impedir que la vista web vuelva a cargar la página
  • Android WebView con caracteres UTF-8 ilegibles.
  • No se muestra la versión de WebView UTF-8 de Android
  • ¿Cómo cambiar el tamaño del contenido de una webview en android?
  • WebView se expande infinitamente - ¿cómo se puede prevenir esto?
  • Método WebView + WebChromeClient onCreateWindow no se llama a target = "_ blank"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.