Android 7中的WebView和wrap_content

12
我有一个在ScrollView中使用了android:layout_height="wrap_content"属性的WebView。在Android 7之前,这会导致WebView根据我使用loadData设置的html内容重新调整大小。但是,在我的安装有Android 7的Nexus 5X上,WebView的高度似乎不可靠,有时它只显示第一行文本的一部分,有时内容末尾出现大的空白间隙。
我认为这可能是由于Google从Nougat开始将Chrome用于WebViews所致。 是否有人对这个问题有解释或修复/解决方法? 此外,这些视图包含在RecyclerView的单元格中可能也很重要。

使用 WebView 显示内容有一定的风险。 - Mohsen Mirhoseini
2个回答

2

解决方法是:

等待 HTML 页面加载并运行页面内的 JavaScript 以检测内容高度,并将其设置为 WebView 布局参数高度。

在页面内运行 JavaScript 很容易,只需导航到类似以下的 URL:

javascript:Math.max(document.body.scrollHeight,document.body.offsetHeight,document.documentElement.clientHeight,document.documentElement.scrollHeight,document.documentElement.offsetHeight);

为了将结果传递给Java代码,您必须提供Java-Java Script接口,如此处所述:https://developer.android.com/guide/webapps/webview.html(将JavaScript代码绑定到Android代码)。
您要导航的URL必须如下所示:
javascript:myfunc(Math.max(document.body.scrollHeight,document.body.offsetHeight,document.documentElement.clientHeight,document.documentElement.scrollHeight,document.documentElement.offsetHeight));

myfunc函数将被调用,您将得到页面的高度。现在只需将其设置为WebView的高度即可。


1
使用WebView在RecyclerView中显示内容有一定风险,效率也不高。你无法确定它在不同设备上的工作情况!
我建议改用TextView,并使用以下命令将HTML内容转换为格式化文本。
textView.setText(Html.fromHtml(<YOUR HTML CONTENT>))

顺便说一下,这是我使用WebView做的一些努力,以实现固定大小来展示一些广告横幅内容:

public class AdsWebView extends WebView {

// some setup codes...
private static final int MAX_SCALE = 120;

public AdsWebView(Context context) {
    setVerticalScrollBarEnabled(false);
    setHorizontalScrollBarEnabled(false);
    setScrollbarFadingEnabled(false);

    setupAdsScale();
}

private int getAdsScale() {
    int width = getDisplayWidth(getContext());
    Double val = Double.valueOf(width) / Double.valueOf(480);
    val = val * 100d;
    return val.intValue();
}


private void setupAdsScale() {
    int scale = getAdsScale();

    if (scale > MAX_SCALE)
        scale = MAX_SCALE;

    setInitialScale(scale);
}

private int getDisplayWidth(Context context) {
    try {
        Activity activity = (Activity) context;
        if (Integer.valueOf(android.os.Build.VERSION.SDK_INT) < 13) {
            Display display = activity.getWindowManager()
                    .getDefaultDisplay();
            return display.getWidth();
        } else {
            Display display = activity.getWindowManager()
                    .getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            return size.x;
        }
    } catch (Exception e) {
        e.printStackTrace();
        return 0;
    }
}

2
我已经知道这个解决方案了,但实际上我需要支持丰富的内容,所以需要比TextView支持的标签更多。不过还是谢谢你的支持! - Micky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接