WebView返回错误的window.innerHeight

时间:2012-09-06 16:32:17

标签: javascript android android-webview

我有一个使用Android WebView的应用程序,以及一些JavaScript。当我的WebViewClient调用onPageFinished()时,我会提醒我的JavaScript运行初始化方法。在点击onPageFinished()之前,我的JavaScript已启用并加载。

在该JavaScript方法中,我使用了window.innerWidth。但是,它返回的值总是错误的并且总是相同的。无论我的方向如何,它都会报告内部宽度为320,内部高度为240.(纵向和横向的正确宽度值分别为360和598。)我访问window.innerWidthwindow.innerHeight的任何其他地方在JavaScript中它给了我一个准确的数字。

更令人费解的是,如果我使用

直接在onPageFinished()来电中检查WebView的高度或宽度

int height = view.getHeight();

int width = view.getWidth();

然后它总是正确返回(虽然它返回确切的像素数,而不是DIP)。这让我觉得一切都已经完成了WebView的加载,因此我的JavaScript不应该有任何问题。

关于发生了什么的任何想法?

提前致谢!

4 个答案:

答案 0 :(得分:8)

这是因为Javascript在WebView的View相关初始化之前执行。 Android WebView向JS返回320x240默认值。 一段时间后执行你的JS就好了,比如这个

function go() {
int height = view.getHeight();
int width = view.getWidth();
};
window.setTimeout(go, 300);

答案 1 :(得分:0)

最后,我使用webView.getHeight()webView.getWidth()中的值,根据屏幕密度调整它们,并通过webView.loadUrl()将它们作为参数传递到javascript方法中。这是我能确定我获得正确价值的唯一方法。

执行上述评论中建议的内容,检查宽度为320,高度为240将会很有效...直到您在具有这些尺寸的设备上运行。

答案 2 :(得分:0)

经过一些阅读后,又出现了另一种解决方案。在java代码中,我们可以使用

new Handler().post(new Runnable(){ 
    @Override 
    public void run(){
        webview.loadUrl("...")
    }
}); 

将它添加到QueueMessage,并将js延迟执行,并且它可以正常工作。

答案 3 :(得分:0)

我用过这个:

iplus中的

Java 代码:

Activity

...

webView.addJavascriptInterface(new WebAppInterface(this), "Android");

JS 代码:

public class WebAppInterface {
    Context mContext;

    WebAppInterface(Context c) {
        mContext = c;
    }

    public int getWinHeight() {
      return webView.getHeight();
    }
}