【问题标题】:Android 7 WebView with wrap_content带有 wrap_content 的 Android 7 WebView
【发布时间】: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 显示内容有点冒险

标签: android html google-chrome webview scrollview


【解决方案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 支持的标签更多。不过感谢您的支持!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多