WebView比需要的高,有很多空白区域

时间:2014-09-01 10:23:50

标签: android webview

我在ScrollView中有一个WebView(周围有更多东西),webview高度设置为wrap_content

在Android 4.0+上运行良好,webview扩展显示所有内容,滚动效果很好。

但我也在Android 2.3.3(Galaxy S2)上进行测试,其高度比内容更高,因此在布局的其余部分之前我会获得很多空白区域。 / p>

要解决它:

我尝试等待页面加载,然后在Javascript中获取内容高度并调用Java代码中的方法,该方法将webview调整到适当的高度。

问题在于我获得的高度也很大(当内容实际上大约为400时,超过7000px)。

使用document.body.getBoundingClientRect().height,我得到1

使用contentDiv.offsetHeight(或scrollHeight,clientHeight),我得到7000 ......

使用jquery .height(),我也得到7000!

因此,如果您有另一个WebView解决方案包装内容......或者知道高度错误的原因。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案!

简化:在xml布局0dp中创建视图。 然后,在加载页面时,创建视图wrap_content。 这看起来还不错,但实际上视图停留在onSizeChanged的无限循环中,无论是大小还是更多,都会调用onSizeChanged。因此,我已经覆盖了该方法,并且在视图大小合适后不会传播该事件。

以下是我的自定义网页浏览的完整代码(在C#中)。

public class WebViewFixWrap : WebView
{
    private bool stopResize = false;

    public WebViewFixWrap (Context context) :
        base (context)
    {
        Initialize ();
    }

    public WebViewFixWrap (Context context, IAttributeSet attrs) :
        base (context, attrs)
    {
        Initialize ();
    }

    public WebViewFixWrap (Context context, IAttributeSet attrs, int defStyle) :
        base (context, attrs, defStyle)
    {
        Initialize ();
    }

    void Initialize ()
    {
        SetWebViewClient (new WebViewClientCustom ());
    }

    public override void SetWebViewClient (WebViewClient client)
    {
        base.SetWebViewClient (client);
        if(!(client is WebViewClientCustom))
            throw new Exception ("WebViewFixWrap requires a WebViewClientCustom, or make sure to implement the same logic in your client.");
    }

    protected override void OnSizeChanged (int w, int h, int oldw, int oldh)
    {
        if (!stopResize) {
            base.OnSizeChanged (w, h, oldw, oldh);
        }
        if (h < oldh) {
            stopResize = true;
        }               
    }

    class WebViewClientCustom : WebViewClient
    {
        public override void OnPageFinished (WebView view, string url)
        {
            var param = view.LayoutParameters;
            param.Height = LayoutParams.WrapContent;
            view.LayoutParameters = param;
            base.OnPageFinished (view, url);
        }
    }
}

这适用于Android 2.3.3到4.4,因此在代码中没有特殊情况。