Android WebView和CSS媒体查询

时间:2013-04-04 20:04:30

标签: android css webview

我有一个基本网页,可以在Android平板电脑(Nexus 7)上的Chrome中显示时,正确响应屏幕尺寸和方向变化(使用CSS媒体查询)。当我在WebView中显示相同的页面时,基于屏幕宽度的媒体查询不起作用。以下是我设置WebView的方法:

WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
webView.loadUrl("http://10.0.1.8:8080/cbc/test");

WebView根据以下媒体查询的行为正确检测方向更改:

@media only screen and (orientation: portrait) {
    .landscape { display: none; }
}

@media only screen and (orientation: landscape) {
    .portrait { display: none; }
}

使用屏幕尺寸的媒体查询无法正常工作,因为根据以下JavaScript,屏幕宽度和高度在方向更改时保持不变:

    $("#dimensions").empty();
    $("#dimensions").append($("<div>Width: " + screen.width + "</div>"));
    $("#dimensions").append($("<div>Height: " + screen.height + "</div>"));
    $("#dimensions").append($("<div>Depth: " + screen.pixelDepth + "</div>"));

我使用“orientationchange”事件触发前面的代码。在Android上的Chrome中运行时,会正确显示宽度和高度值,并将设备方向考虑在内。在WebView内部运行时,无论方向如何,宽度和高度都保持不变。

我是否需要将某些配置应用于WebView以获得预期的行为?

3 个答案:

答案 0 :(得分:0)

尝试查看window.innerWidth&amp;您的javascript中的window.innerHeight

答案 1 :(得分:0)

加载HTML后(屏幕更改后或任何更改),您需要WebView CONTENTS的宽度和高度。 是的,但是没有 getContentWidth 方法(只有视图端口值), 并且 getContentHeight ()不准确!

答案:子类WebView:

/*
  Jon Goodwin
*/
package com.example.html2pdf;//your package

import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;

class CustomWebView extends WebView
{
    public int rawContentWidth   = 0;                         //unneeded
    public int rawContentHeight  = 0;                         //unneeded
    Context    mContext          = null;                      //unneeded

    public CustomWebView(Context context)                     //unused constructor
    {
        super(context);
        mContext = this.getContext();
    }   

    public CustomWebView(Context context, AttributeSet attrs) //inflate constructor
    {
        super(context,attrs);
        mContext = context;
    }

    public int getContentWidth()
    {
        int ret = super.computeHorizontalScrollRange();//working after load of page
        rawContentWidth = ret;
        return ret;
    }

    public int getContentHeight()
    {
        int ret = super.computeVerticalScrollRange(); //working after load of page
        rawContentHeight = ret;
        return ret;
    }
//=========
}//class
//=========

答案 2 :(得分:-1)

对于现代屏幕,您需要指定像素比率。 CSS术语中的像素是测量值,而不是实际像素。高分辨率屏幕和视网膜显示器的像素尺寸不同。制造商尝试基于像素作为大小进行显示,但它不适用于媒体查询。您需要执行以下媒体查询:

@media
  only screen and (-webkit-min-device-pixel-ratio: 2),
  only screen and (   min--moz-device-pixel-ratio: 2),
  only screen and (     -o-min-device-pixel-ratio: 2/1) { 
      //CSS here
}