带有 wrap_content 的 Android 7 WebView

Posted

技术标签:

【中文标题】带有 wrap_content 的 Android 7 WebView【英文标题】:Android 7 WebView with wrap_content 【发布时间】:2017-02-14 03:58:01 【问题描述】:

我在ScrollView 中有一个WebViewandroid:layout_height="wrap_content"。在 Android 7 之前,这会导致 WebView 调整为我使用 loadData 设置的本地 html 内容的高度。不过,在我的 Nexus 5X 和 Android 7 上,WebView 的高度似乎不可靠,有时它只显示第一行的部分内容,有时在内容的末尾会有很大的差距。 我认为这可能是由于 Google 现在使用 Chrome for WebViews 从 Nougat 开始。 有人对此问题有解释或修复/解决方法吗?

视图包含在RecyclerView 的单元格中也可能很重要。

【问题讨论】:

使用 WebView 显示内容有点冒险 【参考方案1】:

解决方法是:

等待html页面被加载并在页面内运行JS来检测内容高度并将其设置为WebView布局参数高度。

在页面内运行JS很容易,只需导航到像这样的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 代码)

您要导航的网址必须看起来像

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

将调用 myfunc 并获取页面高度。现在只需将高度设置为 WebView 高度。

【讨论】:

【参考方案2】:

使用 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;
    

【讨论】:

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

以上是关于带有 wrap_content 的 Android 7 WebView的主要内容,如果未能解决你的问题,请参考以下文章

更改 Android Motion Layout 中的内容后如何使“wrap_content”工作?

如何使 wrap_content 文本视图包装其内容仅足以使其他视图在 LinearLayout android 中可见?

带有水平溢出的Android垂直recyclerview

Android 高度 wrap_content 与固定比率

Android - 获取设置为 wrap_content 的按钮的宽度

Android:如何将高度设置为 wrap_content?