wake-up-neo.com

Wie kann die WebView-Größe dynamisch entsprechend ihrem Inhalt verkleinert werden?

Eine ausführliche Erläuterung des Problems ist aus dieser Frage zu verstehen, da der Benutzer ein Bild hinzugefügt hat, um es besser zu erklären.

Ich lade HTML-Inhalte in mein WebView. Mein Layout hat viele Ansichten, und WebView befindet sich in ScrollView (je nach Layoutanforderung). Bitte antworten Sie nicht als - "Don't put WebView inside ScrollView". Ich weiß, dass es nicht gut ist, WebView in ein ScrollView zu integrieren, aber je nach Anforderung muss ich dies tun. 

Ich habe also ein linkes Fragment (zeigt Listenelemente) und ein rechtes Fragment (zeigt Daten, die bei der Auswahl des Listenelements vom linken Fragment reflektiert werden). Nun, vor allem wenn ich HTML-Inhalte in WebV lade, wird dies korrekt angezeigt. Danach, wenn ich WebView mit neuem HTML-Inhalt aktualisiere, tritt das Problem auf.

Angenommen, mein erster HTML-Inhalt besteht aus 100 Zeilen, und er wird korrekt geladen. Anschließend lade ich WebView mit meinem neuen HTML-Inhalt, der aus 40 Zeilen besteht, dann schrumpft der WebView nicht und passt sich dem Inhalt mit 40 Zeilen an. Er bleibt jedoch immer noch 100 Zeilen mit weißem/leerem Bereich am unteren Rand.

Es scheint also, dass WebView in der Lage ist, sich von weniger Inhalten, die zuvor in mehr Inhalt geladen wurden, in der Größe zu ändern, jedoch nicht in der Lage ist, die Größe neu zu bestimmen, wenn der Inhalt weniger ist als der zuvor geladene Inhalt.

Ich hatte viele Möglichkeiten ausprobiert,

  • Hinzufügen von Android:hardwareAccelerated="true" in Manifest
  • Dieses Blog
  • Auch viele andere Möglichkeiten und Blog
  • Ich hatte auch versucht, mWebView.clearView(); zu verwenden, wodurch die Größe von WebView geändert wird, aber manchmal blinkt das WebView, was nur nervig ist. Ähnlich wie dieses Video

Aber konnte keine richtige Lösung finden. Wenn einer von Ihnen das gleiche Problem hat, lass es mich wissen, welche Lösung ich am besten einsetzen kann.

UPDATE -

Nach weiterem googeln scheint es sich bei Honeycomb um ein bekanntes Problem zu handeln. Diese Frage weist auch auf ein ähnliches Problem hin.

24
Lalit Poptani

Es scheint nicht möglich zu sein, die Größe des WebView dynamisch zu verändern (verkleinern), sobald es geladen ist. Das einzige, was mein Problem lösen konnte, war das Neuladen des kompletten WebView.

Anstatt das Fragment in XML zu definieren, änderte ich mein Material, indem ich jedes Mal Fragment dynamisch hinzufügte. Womit ich mein Problem lösen konnte.

5
Lalit Poptani

Dies ist ein bekanntes Problem mit WebView und einige verfügbare Lösungen funktionieren nicht auf allen Geräten.

Ich habe viele Lösungen aus SO -Antworten ausprobiert und auch über das Internet gesucht, aber keine davon funktionierte für mich.

Ich endete, entfernte das WebView und fügte das WebView wieder an derselben Position in Layout hinzu

Hier ist der Demo-Code,

        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

jungs, es scheint, ich habe eine Lösung für lokale Inhalte gefunden. Sie sollten einfach webView.reload () aufrufen, bevor Sie neuen Inhalt laden - irgendwie ändert sich die Größe, ohne zu blinken. 

1
Vladimir Ivanov

Ich habe die Sichtbarkeit meiner WebView auf "Gone" gesetzt und lade den Inhalt in die WebView, während sie weg ist. Dann habe ich die Sichtbarkeit auf sichtbar gesetzt, nachdem DOM und JS geladen wurden, und es scheint, als würde sie die Länge korrekt ziehen. Da es keinen Rückruf wie onPageFinished gibt, um festzustellen, wann die Ausführung des JS abgeschlossen ist, gebe ich dem WebView eine Verzögerung von einer Sekunde, bevor ich die Sichtbarkeit auf "true" setze. Diese Problemumgehung reicht für meine Zwecke aus und hoffentlich erfüllt sie die Bedürfnisse einiger von Ihnen!

0
Steven

Wenn @Ankit darauf hinweist, könnte eine leere Seite hilfreich sein. "about: blank" ist jedoch besser.

0
fiorentinoing

Dies mach die Magie! Es sagt

Android-Eigenschaft: Android: layout_weight = "1 im Layout sollte funktionieren ...

In meinem Fall befindet sich WebView im RelativeLayout. Also tat dies Android: layout_height = "wrap_content" funktionierte wie ein Zauber :)

0
theWook

Jedes Mal, wenn Sie ein Webview-Objekt erstellen und dessen Parameter angeben, ist es ein Schmerz, stattdessen können Sie die folgenden Schritte ausführen und es funktioniert

  • legen Sie eine leere HTML-Datei in den Ordner assets und geben Sie einen Namen empty.html

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

  • laden Sie jetzt Ihren Inhalt.

Webview verkleinert die Höhe.

Stellen Sie sicher, dass Sie nicht setzen Inhalte in empty.html setzen.

0
Ankit

Hier habe ich die Höhe der Webansicht in Abhängigkeit von der Softkeyboard-Anzeige geändert

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

ich habe es nicht versucht, aber warum versuchen Sie es nicht, indem Sie erneut Weblayout-Parameter festlegen, bevor Sie den neuen Inhalt laden. dh setzen Sie Höhe und Breite auf den Inhalt. Wenn Erfolg gefunden wurde, antworten Sie bitte. Wenn Sie keinen Erfolg finden, gehen Sie lieber zu Javascipt 

0
Sush