web-dev-qa-db-fra.com

Comment réduire la taille de WebView de manière dynamique en fonction de son contenu?

Une explication détaillée du problème peut être comprise à partir de cette question car l'utilisateur avait ajouté une image pour mieux l'expliquer.

Je charge du contenu HTML dans mon WebView. Ma mise en page a plusieurs vues et WebView est placé dans ScrollView (selon les exigences de mise en page). S'il vous plaît ne répondez pas comme - "Don't put WebView inside ScrollView". Je sais que ce n'est pas une bonne chose de mettre WebView à l'intérieur d'un ScrollView, mais conformément aux exigences, je dois le faire. 

Donc, j'ai fragment gauche (montrant les éléments de la liste) et fragment droit (montrant les données reflétées sur la sélection d'un élément de la liste du fragment gauche). Maintenant, tout d’abord, lorsque je charge du contenu HTML dans WebV, il s’avère correct. Ensuite, lorsque j'actualise WebView avec un nouveau contenu HTML, le problème se produit.

Supposons que mon premier contenu html soit de 100 lignes, il s'affiche correctement, puis que je recharge WebView avec mon nouveau contenu html de 40 lignes. WebView ne rétrécit pas et ne correspond pas au contenu de 40 lignes. lignes montrant un espace blanc/blanc en bas.

Il semble donc que WebView est capable de se redimensionner lui-même de moins de contenu précédemment chargé vers plus de contenu, mais incapable de se redimensionner lorsque le contenu est inférieur au contenu précédemment chargé.

J'avais essayé de nombreuses manières,

  • Ajout de Android:hardwareAccelerated="true" dans le manifeste
  • Ce blog
  • Aussi beaucoup d'autres façons et blog
  • J'avais aussi essayé d'utiliser mWebView.clearView();, ce qui a pour effet de redimensionner la taille de WebView mais parfois, WebView se met à clignoter, ce qui est simplement gênant. Similaire à cette vidéo

Mais, ne pouvait pas trouver une solution appropriée. Si quelqu'un d'entre vous a le même problème avant, faites-le moi savoir la meilleure solution que je pourrais appliquer.

METTRE À JOUR -

Après une recherche approfondie, il semble que ce problème soit bien connu dans Honeycomb. Cette question indique également le même problème.

24
Lalit Poptani

Il semble qu'il n'y ait aucun moyen de redimensionner la WebView (diminuer) sa taille de manière dynamique une fois chargée. Donc, la seule chose qui pouvait résoudre mon problème était de recharger la WebView complète.

Ainsi, au lieu de définir le Fragment en XML, j'ai modifié mes données en ajoutant Fragment de manière dynamique à chaque fois. Par lequel j'ai pu résoudre mon problème.

5
Lalit Poptani

Il s'agit d'un problème connu avec WebView et certaines solutions disponibles ne fonctionnent pas dans tous les périphériques.

J'ai essayé beaucoup de solutions données dans les réponses SO et j'ai également cherché sur Internet, mais aucune d'entre elles n'a fonctionné pour moi aussi.

Je me suis retrouvé, en supprimant le WebView et en ajoutant le WebView à la même position dans Layout

Voici ce code de démonstration,

        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
MKJParekh

les gars, il semble que j'ai trouvé une solution pour le contenu local. Vous devez simplement appeler webView.reload () avant de charger le nouveau contenu - il effectue le redimensionnement sans aucun clignotement 

1
Vladimir Ivanov

Je règle la visibilité de mon WebView sur Gone et charge le contenu dans le WebView pendant son absence. Ensuite, je règle la visibilité sur visible après avoir laissé le DOM et le JS se charger et il semble dessiner correctement la longueur. Puisqu'il n'y a pas de rappel comme onPageFinished pour déterminer quand le JS a fini de s'exécuter, je laisse à la WebView un délai d'une seconde avant de définir la visibilité sur true. Cette solution de contournement suffit à mes besoins, alors espérons-le, elle répond aux besoins de certains d'entre vous!

0
Steven

Comme @Ankit l'a souligné, accéder à une page vide pourrait aider. "about: blank" est préférable, cependant.

0
fiorentinoing

This fais la magie! Ça dit

Propriété Android: Android: layout_weight = "1 dans la présentation devrait fonctionner ...

Dans mon cas, WebView est dans RelativeLayout. Donc, faire cela Android: layout_height = "wrap_content" a fonctionné comme un charme :)

0
theWook

Chaque fois que vous créez un objet de WebView et que vous lui donnez ses paramètres, vous pouvez effectuer les étapes suivantes et cela fonctionnera

  • placez un fichier HTML vide dans le dossier assets et nommez-le empty.html

  • appeler webview.loadUrl("file:///Android_asset/empty.html");

  • chargez maintenant votre contenu.

Webview va réduire sa hauteur.

Assurez-vous que ne mettez pas de contenu dans empty.html

0
Ankit

Ici, j'ai changé la hauteur de la vue Web en fonction de l'affichage du clavier logiciel

  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;
                    }
                 }
            });

je n'ai pas essayé, mais pourquoi ne pas essayer en réglant à nouveau les paramètres de weblayout, avant de charger le nouveau contenu. c'est-à-dire régler la hauteur et la largeur à wrapcontent. si le succès est trouvé, veuillez répondre. si vous ne trouvez pas le succès, il vaut mieux aller pour javascipt 

0
Sush