【问题标题】:android webview wrapp content no working and webview can't set height after it has loaded a pageandroid webview wrapp content no working and webview在加载页面后无法设置高度
【发布时间】:2013-11-30 17:15:08
【问题描述】:

我正在尝试在 WebView 中加载仅包含一张图片的 html。 webview 应该包装它包含的所有内容,所以我将宽度设置为“fill_parent”,将高度设置为“wrap_content”。

图片应该扩展到WebView的宽度,高度应该自动调整以保持纵横比,图片在WebView中应该是不可滚动的。 为此,我将图片和 html 正文的样式设置为:

body{
margin:0px; 
padding:0px;  
}
img {
margin:0px;
padding:0px;
width:100%;
height:auto;
}

这工作正常,但对于某些图片在 WebView 的底部留下了一个空白区域。 这是随机发生的,例如,图片也可能非常小并且可以正常工作。

我也尝试了很多不同的方法来实现这一点:

1 - 在img "loaded" js事件上回调android代码,用图片的大小,计算WebView的对应尺寸并从代码中设置。

2 - 在img "loaded" js事件上计算WebView的对应尺寸并调用"window.resizeTo(w,h)"

还有其他一些技巧。但最终要么 WebView 不包装内容,要么 WebView 在页面加载后忽略任何高度设置。

任何帮助或建议都会非常有用,因为我在这方面度过了一个周末,但没有任何成功。

【问题讨论】:

    标签: javascript android html css webview


    【解决方案1】:

    页面更改/加载后似乎确实需要重新设置高度

    我一直在解决这个错误,因为它困扰着我,我更像是一个网络与移动应用程序开发人员。想要解决这个问题,这样我就可以继续前进。

    在玩了一个小时左右的 webview 之后......似乎在页面更改/加载后确实需要重新设置高度......我正在使用本地字符串并通过加载它们“WebView.loadData”

    这里有一些应该可以工作的示例代码?也许不是全部,但它是我目前正在测试的......

    还请注意,这是使用 "RelativeLayout" 并且并不总是像本示例那样推荐使用 "final" 的做法(但保留代码现在更短了),很抱歉缺少所有的 cmets

    //LOCATE OUR WEBVIEW
    final WebView tmpWeb=(WebView) findViewById(R.id.myWebView1);
    
    // WEBVIEW LISTENER: DETECT WHEN PAGE HAS LOADED
    tmpWeb.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {
            if (progress==100) {
                // PAGE HAS LOADED, SET HEIGHT BACK TO WRAP_CONENT
                tmpWeb.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.WRAP_CONTENT));
    
                // MY NEW CODE: CONTINUE THE APPLICATION/GUI/USER
                // Here we would re-enable buttons/gui's and so on.
            }
        }
    }
    
    // CHANGE WEBVIEW HEIGHT TO 20 - NOTHING SHOULD HAPPEN BELOW THIS CODE
    tmpWeb.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,20));
    tmpWeb.loadData("<p>My HTML</p>", "text/html", "utf-8");
    

    请记住,这只是目前对我有用的一个例子......所以还有一些其他的事情要记住

    • 当通过用户点击加载页面时,确保按钮没有双击“运行两次”
    • 在当前页面加载并达到 100% 之前打开另一个页面/loadData
    • 错误处理,如果页面未加载..我认为在此进度中不会达到 100%
    • 等待图片加载(考虑使用 CSS 预先调整大小/定位)
    • 加载页面后会调整大小的其他动态网页内容(google this)
    • 页面加载后改变页面大小的任何事情都可能发生

    至于 HTML 方面

    通常 HTML/CSS 应该可以正常工作,因为所有页面默认会缩小到它们的最小尺寸。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      相关资源
      最近更新 更多