带有 wrap_content 的 Android 7 WebView
Posted
技术标签:
【中文标题】带有 wrap_content 的 Android 7 WebView【英文标题】:Android 7 WebView with wrap_content 【发布时间】:2017-02-14 03:58:01 【问题描述】:我在ScrollView
中有一个WebView
和android: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 中可见?