27

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

我在我的 WebView 中加载 Html 内容。我的布局有很多视图,WebView 放置在 ScrollView 内(根据布局要求)。请不要回答为 - "Don't put WebView inside ScrollView"。我知道将 WebView 放在 ScrollView 中并不是一件好事,但根据要求我需要这样做。

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

假设,我的第一个 Html 内容有 100 行,它正确显示,然后我用新的 40 行 Html 内容重新加载 WebView,然后 WebView 没有缩小并适合 40 行的内容,它仍然保持只要 100在底部显示白色/空白区域的线条。

因此,似乎 WebView 能够从先前加载的较​​少内容重新调整自身大小,但当内容小于先前加载的内容时无法重新调整自身大小。

我试过很多方法,

  • 添加android:hardwareAccelerated="true"清单
  • 这个博客
  • 还有许多其他方式和博客
  • 此外,我曾尝试使用mWebView.clearView();哪些原因来重新调整 WebView 的大小,但有时 WebView 开始闪烁,这很烦人。类似于这个视频

但是,找不到任何合适的解决方案。如果你们中的任何人之前有同样的问题,请告诉我我可以应用的最佳解决方案。

更新 -

在进一步谷歌搜索之后,这似乎是 Honeycomb 中的一个众所周知的问题。这个问题也表明了类似的问题。

4

9 回答 9

6

似乎没有办法在加载后动态调整 WebView(减小)其大小。所以,唯一可以解决我的问题的是重新加载完整的 WebView。

因此,我没有在 XML 中定义 Fragment,而是通过每次动态添加 Fragment 来改变我的东西。通过它我能够解决我的问题。

于 2013-04-01T05:01:41.307 回答
1

这是一个已知问题,WebView并且某些可用的解决方案不适用于所有设备。

我尝试了 SO 答案中给出的许多解决方案,并在互联网上进行了搜索,但没有一个对我有用。

我最终删除了 WebView 并在 Layout 中的相同位置再次添加了 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);
于 2013-03-21T13:06:25.373 回答
1

伙计们,我似乎找到了本地内容的解决方案。您应该在加载新内容之前调用 webView.reload() - 它以某种方式调整大小而不会闪烁。

于 2013-05-31T07:38:12.293 回答
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;
                    }
                 }
            });
于 2014-09-29T12:41:32.220 回答
0

我还没有尝试过,但你为什么不在你加载新内容之前通过再次设置 weblayout 参数来尝试一下。即设置高度和宽度来包装内容。如果发现成功请回复。如果找不到成功,最好选择 javascipt

于 2013-03-22T08:28:23.297 回答
0

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

于 2013-09-10T18:43:27.473 回答
0

每次创建 webview 的对象并为其提供参数都是一种痛苦,相反,您可以执行以下步骤,它会起作用

  • 将一个空白的 html 文件放入assets文件夹并为其命名 empty.html

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

  • 现在加载您的内容。

Webview 会缩小它的高度。

确保您没有放入任何内容empty.html

于 2014-03-10T07:37:47.560 回答
0

会变魔术!它说

Android 属性:android:layout_weight = "布局中的 1 应该可以工作...

在我的例子中,WebView 在RelativeLayout 中。所以这样做 android:layout_height="wrap_content" 就像一个魅力:)

于 2014-07-25T07:41:19.313 回答
0

正如@Ankit 指出的那样,转到一个空白页面可能会有所帮助。不过,“about:blank”更好。

于 2015-05-25T15:02:06.917 回答