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


Una explicación detallada del problema se puede entender de esta pregunta como el usuario había añadido la imagen para explicarlo mejor.

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

Por lo tanto, he Dejado el Fragmento (mostrando los elementos de la Lista) y la Derecha Fragmento (Muestra los datos reflejados en la selección del Elemento de la Lista del Fragmento izquierdo). Ahora, en primer lugar cuando cargo contenido Html dentro de WebV se muestra correcto. Después de eso, cuando refresco WebView con nuevo contenido Html, se produce el problema.

Supongamos que mi primer contenido Html es de 100 líneas se muestra correctamente y luego recargo WebView con mi nuevo contenido Html que es de 40 líneas, entonces el WebView no se reduce y se ajusta al contenido con 40 líneas, todavía permanece mientras se muestren 100 líneas blanco/espacio en blanco en la parte inferior.

Por lo tanto, parece que WebView es capaz de redimensionarse a sí mismo de menos contenido que se cargó previamente a más contenido, pero no puede redimensionarse a sí mismo cuando el contenido es menor que el contenido cargado previamente.

Había intentado muchas maneras,

  • Añadiendo android:hardwareAccelerated="true" en el Manifiesto
  • Este Blog
  • También muchas otras formas y blog
  • También había intentado usar mWebView.clearView(); lo que hace que se vuelva a dimensionar el tamaño de WebView, pero a veces el WebView empezar a parpadear que es simplemente molesto. Similar a este video

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

ACTUALIZACIÓN -

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

Author: Community, 2013-03-21

9 answers

Parece que no hay manera de cambiar el tamaño de la WebView(disminuir) su tamaño dinámicamente una vez que se carga. Entonces, lo único que podía resolver mi problema era recargar la vista WEB completa.

Así que, en lugar de definir el Fragmento en XML, cambié mis cosas agregando Fragmentos dinámicamente cada vez. Por lo que fui capaz de resolver mi problema.

 5
Author: Lalit Poptani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-18 07:42:45

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

Probé muchas soluciones dadas en SO answers y también busqué en Internet, pero ninguna de ellas funcionó para mí también.

Terminé, eliminando la WebView y agregando la WebView nuevamente en la misma posición en en Layout

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);
 1
Author: MKJParekh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-21 13:06:25

Chicos, parece que he encontrado una solución para el contenido local. Deberías llamar a WebView.reload () antes de cargar contenido nuevo - de alguna manera hace el redimensionamiento sin parpadear.

 1
Author: Vladimir Ivanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-31 07:38:12

No lo he intentado, pero por qué no lo intentas configurando los parámetros de weblayout de nuevo, antes de cargar el nuevo contenido. ie establece altura y anchura en wrapcontent. si el éxito encontrado por favor responder. si no encuentra el éxito mejor ir para javascipt

 0
Author: Sush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-22 08:28:23

Establezco la visibilidad de mi WebView en Gone, y carga el contenido en la WebView mientras está gone. Luego establezco la visibilidad en visible después de dejar que el DOM y JS carguen 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 ejecutarse, le doy al WebView un segundo de retraso antes de establecer la visibilidad en true. Esta solución es suficiente para mis propósitos, así que espero que aborde las necesidades de algunos de ustedes chicos!

 0
Author: Steven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-10 18:43:27

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

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

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

  • Ahora carga tu contenido.

Webview reducirá su altura.

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

 0
Author: Ankit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-10 07:37:47

Esto ¡haz la magia! Dice

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

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

 0
Author: theWook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:11

Aquí he cambiado la altura de webview dependiendo de la pantalla de softkeyboard

  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;
                    }
                 }
            });
 0
Author: Parikshit Singh Shekhawat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-29 12:41:32

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

 0
Author: fiorentinoing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-25 15:02:06