如何根据WebView内容动态缩小WebView的大小?

28

可以从这个问题中了解到有关问题的详细说明,因为用户添加了图像以更好地解释它。

我正在加载Html内容到我的WebView中。我的布局有许多视图,而WebView放置在ScrollView中(根据布局要求)。请不要回答 - "不要将WebView放在ScrollView中"。我知道将WebView放在ScrollView中不是一件好事,但是根据要求,我需要这样做。

因此,我有左侧片段(显示列表项)和右侧片段(显示从左侧片段选择的列表项上反映的数据)。现在,首先当我在WebV中加载Html内容时,它显示正确。之后,当我使用新的Html内容刷新WebView时,问题就出现了。

假设,我的第一个Html内容有100行,它显示正确,然后我用40行的新Html内容重新加载WebView,那么WebView不会缩小并适合具有40行的内容,它仍然与100行一样长,在底部显示白色/空白空间。

因此,似乎WebView能够从先前加载的较少内容重新调整大小以适应更多内容,但当内容少于先前加载的内容时,它无法重新调整大小。
我尝试了许多方法,
  • 在清单中添加android:hardwareAccelerated="true"
  • 这个博客
  • 还有很多其他方法和博客
  • 我也尝试使用mWebView.clearView();来重新调整WebView的大小,但有时WebView开始闪烁,这只是令人恼火的。类似于这个视频
但是,我找不到任何合适的解决方案。如果您们中有人之前遇到过同样的问题,请告诉我可以应用的最佳解决方案。 更新 -

经过进一步搜索,似乎这是Honeycomb中一个众所周知的问题。这个问题也指出了类似的问题。


你可能已经尝试过了,但我想确认一下,你是否尝试在webView上调用invalidate方法。另外一个问题是,你是否将scrollView的fillViewPort属性设置为true。 - N-JOY
@N-JOY 是的,我已经尝试过调用mWebView.invalidate(),并且我也尝试使用ScrollView的fillViewPort,但仍然没有成功。 - Lalit Poptani
9个回答

6
似乎没有办法动态地调整WebView(缩小)大小,一旦它被加载了。所以,唯一能解决我的问题的事情就是重新加载整个WebView。
因此,我改变了我的东西,不是在XML中定义Fragment,而是每次动态地添加Fragment。通过这种方式,我成功地解决了我的问题。

“重新加载完整的 Webview”是什么意思? - Bryan
1
@Bryan,这意味着我正在用另一个完整的片段替换它。 - Lalit Poptani

1
这是一个已知的问题,涉及到WebView,有些可用的解决方案并不适用于所有设备。
我尝试了许多在SO答案中给出的解决方案,并在互联网上搜索,但它们都对我没用。
最终,我选择移除WebView并在同一位置重新添加WebView
以下是演示代码:
        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
感谢回复,但你是否查看了我在问题中添加的此博客?该博客明确指出,如果我们每次动态添加WebView,它会产生闪烁效果。 - Lalit Poptani
1
这在我的情况下起作用了,所谓的“闪烁”几乎是不可见的。 - sandalone

1

大家好,看起来我找到了一个本地内容的解决方案。在加载新内容之前,只需调用webView.reload()即可 - 不知何故,它可以进行调整而没有任何闪烁。


我也尝试过重新加载的方法,但是也没有找到幸运的解决办法。:( - Lalit Poptani
这很疯狂,但对于本地内容确实有效!偶尔会失败,但总体上看起来是一个相当不错的解决方案。 - goat

1

在这里,我根据软键盘的显示,改变了webview的高度。

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

软键盘对我完全没有任何问题,因此这与我的问题毫无关联。 - Lalit Poptani

0

我没有尝试过,但为什么不再次设置WebLayout参数,然后再加载新内容呢?即将高度和宽度设置为WrapContent。如果成功,请回复。如果没有找到成功的方法,最好使用JavaScript。


0

每次创建一个WebView对象并给它的参数是一件痛苦的事情,而你可以按照以下步骤操作,它就会起作用:

  • assets文件夹中放置一个空的HTML文件,并将其命名为empty.html

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

  • 现在加载你的内容。

WebView将缩小其高度。

确保不要empty.html中放置任何内容。


不行,对我没用。我猜这些技巧有时在某些设备上使用不同的固件可能有效,但它们并不是所有设备都百分之百可靠的东西。 - Kaizie

0
我将我的WebView的可见性设置为Gone,并在其不可见时加载内容到WebView中。然后,在DOM和JS加载完成后,我将可见性设置为visible,它似乎正确地绘制了长度。由于没有像onPageFinished这样的回调来确定JS何时执行完成,所以我在将可见性设置为true之前给WebView一个一秒的延迟。这个解决方法对我的目的足够了,希望它能满足你们中的一些人的需求!

0

这个就是魔法!它说:

在布局中,Android属性:android:layout_weight = "1应该可以起作用...

在我的情况下,WebView位于RelativeLayout中。所以使用android:layout_height="wrap_content"就像魔法一样奏效了 :)


1
对我来说也可以。似乎是最简单的解决方案。我的 WebView 是 LinearLayout 的子元素,其 layout_height 设置为 "0dp"。 - Bunkerbewohner
请提供您的布局。我的 WebView 总是获取 0 高度。 - vyndor
@AlpAltunel 请阅读更多内容:“在我的情况下,WebView位于RelativeLayout中。因此,使用android:layout_height="wrap_content"非常有效 :)” - theWook

0

正如@Ankit所指出的那样,前往一个空白页面可能会有所帮助。然而,“about:blank”更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接