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

时间:2013-03-21 11:35:22

标签: android performance android-layout webview android-widget

可以从this question了解问题的详细说明,因为用户添加了图片以便更好地解释它。

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

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

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

因此,似乎WebView能够从较少的内容重新调整自身大小,这些内容先前已加载到更多内容,但在内容少于先前加载的内容时无法重新调整大小。

我尝试了很多方法,

  • 在清单中添加android:hardwareAccelerated="true"
  • This Blog
  • 还有很多其他方式和博客
  • 此外,我曾尝试使用mWebView.clearView();导致重新调整WebView的大小,但有时WebView开始闪烁,这只是令人讨厌。与this video
  • 类似

但是,找不到任何合适的解决方案。如果你们中的任何人遇到同样的问题,请让我知道我可以申请的最佳解决方案。

更新 -

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

9 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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);

答案 2 :(得分:1)

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

答案 3 :(得分: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;
                    }
                 }
            });

答案 4 :(得分:0)

我没有尝试,但为什么不在尝试再次设置weblayout params,然后再加载新内容。即设置高度和宽度以包裹内容。如果成功,请回复。如果不能找到更好的成功去javascipt

答案 5 :(得分:0)

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

答案 6 :(得分:0)

每次创建webview对象并给它的参数都是一种痛苦而不是你可以做以下步骤而且它会起作用

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

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

  • 现在加载您的内容。

Webview将缩小其高度。

确保您在<{1}}

没有任何内容

答案 7 :(得分:0)

This做神奇的事!它说

  

Android属性:android:layout_weight =&#34;布局中的1应该可以工作......

就我而言,WebView位于RelativeLayout中。所以做android:layout_height =&#34; wrap_content&#34;像魅力一样工作:)

答案 8 :(得分:0)

正如@Ankit指出的那样,转到一个空页面可能有所帮助。 &#34;关于:空白&#34;但是更好。