WebView返回错误的window.innerHeight

WebView returns bad window.innerHeight

本文关键字:window innerHeight 错误 返回 WebView      更新时间:2023-09-26

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

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

更令人困惑的是,如果我使用在onPageFinished()调用中直接检查WebView的高度或宽度

int height = view.getHeight();

int width = view.getWidth();

则它总是正确返回(尽管它返回的是精确的像素数而不是DIP)。这让我觉得WebView已经完成了所有的加载,所以我的JavaScript应该不会有任何问题。

有什么想法吗?

提前感谢!

这是因为Javascript在WebView的View相关初始化之前执行。安卓WebView会为JS返回一个320x240的默认值。一段时间后执行你的JS是可以的,就像这个

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

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

按照上面评论中的建议,检查320的宽度和240的高度将非常有效。。。直到你在具有这些精确尺寸的设备上运行。

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

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

将其添加到QueueMessage中,并延迟js的执行,它就工作了。

我使用了这个:

JavaActivity:中的代码

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

public class WebAppInterface {
    Context mContext;
    WebAppInterface(Context c) {
        mContext = c;
    }
    public int getWinHeight() {
      return webView.getHeight();
    }
}

JS代码:

var winHeight = Android.getWinHeight();