我在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解决方案包装内容......或者知道高度错误的原因。
答案 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,因此在代码中没有特殊情况。