Android 7 WebView,包含wrap_内容

Android 7 WebView,包含wrap_内容,android,html,google-chrome,webview,scrollview,Android,Html,Google Chrome,Webview,Scrollview,我有一个WebView和android:layout\u height=“wrap\u content”在滚动视图中。在Android 7之前,这导致WebView的大小调整到我用loadData设置的本地html内容的高度。不过,在我的Nexus 5X和Android 7上,网络视图的高度似乎不可靠,有时它只显示第一行文本的一部分,有时在内容末尾有一个很大的间隙。 我认为这可能是因为谷歌现在使用Chrome浏览器,从牛轧糖开始。 有人对此问题有解释或解决方法吗 视图包含在RecyclerVie

我有一个
WebView
android:layout\u height=“wrap\u content”
滚动视图中。在Android 7之前,这导致WebView的大小调整到我用
loadData
设置的本地html内容的高度。不过,在我的Nexus 5X和Android 7上,网络视图的高度似乎不可靠,有时它只显示第一行文本的一部分,有时在内容末尾有一个很大的间隙。
我认为这可能是因为谷歌现在使用Chrome浏览器,从牛轧糖开始。 有人对此问题有解释或解决方法吗

视图包含在
RecyclerView

的单元格中可能也很重要,使用WebView显示RecyclerView中的内容有点冒险,效率也不高。你不知道它在不同的设备中是如何工作的

我建议您使用TextView更改解决方案,并使用此命令将HTML内容转换为格式化文本

textView.setText(Html.fromHtml(<YOUR HTML CONTENT>))
textView.setText(Html.fromHtml())
顺便说一句,我在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;
    }
}
公共类AdsWebView扩展了WebView{
//一些设置代码。。。
专用静态最终整数最大刻度=120;
公共AdsWebView(上下文){
setVerticalScrollBarEnabled(假);
setHorizontalScrollBarEnabled(假);
SetScrollBarFadinEnabled(假);
setupadscale();
}
私有int getAdsScale(){
int width=getDisplayWidth(getContext());
Double val=Double.valueOf(宽度)/Double.valueOf(480);
val=val*100d;
返回val.intValue();
}
私有void setupadscale(){
int scale=getAdsScale();
如果(比例>最大比例)
刻度=最大刻度;
设置初始刻度(刻度);
}
私有int getDisplayWidth(上下文){
试一试{
活动=(活动)上下文;
if(Integer.valueOf(android.os.Build.VERSION.SDK_INT)<13){
Display Display=activity.getWindowManager()
.getDefaultDisplay();
返回display.getWidth();
}否则{
Display Display=activity.getWindowManager()
.getDefaultDisplay();
点大小=新点();
display.getSize(size);
返回大小.x;
}
}捕获(例外e){
e、 printStackTrace();
返回0;
}
}
解决方法是:

在加载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脚本接口(将JavaScript代码绑定到Android代码)

您要导航的url必须如下所示

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

myfunc将被调用,您将获得页面的高度。现在只需将高度设置为WebView高度。

使用WebView显示内容有点风险我已经知道这个解决方案,但我实际上需要支持丰富的内容,因此标签比TextView支持的多。但是感谢您的支持!