【问题标题】:WebView returns bad window.innerHeightWebView 返回错误的 window.innerHeight
【发布时间】:2012-08-31 12:48:22
【问题描述】:

我有一个使用 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 不应该有任何问题。

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

提前致谢!

【问题讨论】:

  • 我们有类似的问题,但高度和宽度为 0。

标签: javascript android android-webview


【解决方案1】:

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

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

【讨论】:

  • 我很欣赏这个建议。我想这可能行得通。我不喜欢仅仅因为我不明白一些事情而增加不必要的时间。知道为什么 WebView 还没有准备好? onPageFinished() 已被调用。
  • 是的,这是一个 Android WebKit 错误。其实你不需要等那么久。根据我们的经验,我们只需要等待 30ms。
  • 我也有同样的问题;当文档加载到 Webview 中时,有时 Javascript 运行得太早,我得到 window.innerWidth = 320 和 window.innerHeight = 240。我尝试了 100 毫秒的超时,但这并不总是足够的! (即使在 Nexus 10 平板电脑等快速设备上!)
  • 我的解决方案是检查window.innerWidth == 320 && window.innerHeight == 240,在这种情况下等待100ms再试一次。
【解决方案2】:

最后,我使用了来自webView.getHeight()webView.getWidth() 的值,根据屏幕密度调整了它们,然后通过webView.loadUrl() 将它们作为参数传递给javascript 方法。这是我可以确定我得到正确值的唯一方法。

按照上面 cmets 中的建议进行操作,检查 320 的宽度和 240 的高度会很好...直到您在具有这些精确尺寸的设备上运行。

【讨论】:

    【解决方案3】:

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

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

    添加到QueueMessage中,延迟js执行,就可以了。

    【讨论】:

    • 已经有一段时间了,我什至不再从事这个项目,但这真的解决了竞态问题吗?由于WebView 在自己的线程上运行,因此无法确保即使post() 也有足够的时间让它初始化,对吧?
    • 事实上,经过多次试验,它是有效的。正如你所说,webview什么时候初始化是未知的!
    • 如前所述,window.setTimeout(go, 300);这也是未知数。有些设备可能需要 1000 个!
    【解决方案4】:

    我用过这个:

    Java 代码在Activity:

    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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      相关资源
      最近更新 更多