提问人:gnuanu 提问时间:12/19/2013 最后编辑:MartyIXgnuanu 更新时间:9/1/2016 访问量:38310
Android KitKat 中的 WebView 渲染问题
WebView Rendering Issue in Android KitKat
问:
我一直在开发一个具有 WebView 的应用程序,其中静态页面从资产中加载(也使用 JavaScript)。此 WebView 在 KitKat 中不起作用,它仍然是空白的。我知道渲染引擎(webkit 到 chromium)的变化发生在 kitkat 的 WebView 中,并尝试了迁移步骤,这在 Android 开发人员页面中给出。但这无济于事。
在logcat中,我收到一个从Chromium源抛出的错误。
W/AwContents﹕ nativeOnDraw failed; clearing to background color.
请提出解决方法。
答:
我遇到了同样的问题,但我确实找到了解决方法。您所要做的就是为您的网页显式设置CSS背景。这样:
body {
background: white;
}
事实证明,如果您没有为网页显式设置背景,WebView 将无法绘制所述背景,并且您最终会得到一个透明的 WebView。
就我而言,在 Android 4.4 中,无论我设置什么,我都会得到一个黑色背景,并且我的 LogCat 中的此错误消息:nativeOnDraw 失败;清除为背景颜色。
从谷歌搜索来看,这似乎是因为 Chromium WebView 不支持硬件加速画布渲染。我将此行添加到 WebView 以关闭硬件加速画布,现在它可以工作了。
mWebview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
评论
这似乎是一个 chromium webview 错误。
这是关于该问题的帖子: https://jira.appcelerator.org/browse/TIMOB-16479
显然,公认的答案并不是一个确定的解决方案。链接中提到了解决方法。
评论
package com.example.testandroid;
public class MainActivity extends ActionBarActivity {
WebView webView=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null)
{
((WebView)findViewById(R.id.web_view)).restoreState(savedInstanceState);
}
else{
webView=(WebView)findViewById(R.id.web_view);
webView.loadUrl("http://www.google.co.in");
webView.getSettings().getJavaScriptEnabled();
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
webView.setWebViewClient(new WebViewClient()
{
@Override
public boolean shouldOverrideUrlLoading(WebView view,
String url) {
// TODO Auto-generated method stub
view.loadUrl(url);
return true;
}
});
}
}
protected void onSaveInstanceState(Bundle outState) {
webView.saveState(outState);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// Check if the key event was the Back button and if there's history
if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
webView.goBack();
return true;
}
// If it wasn't the Back key or there's no web page history, bubble up to the default
// system behavior (probably exit the activity)
return super.onKeyDown(keyCode, event);
}
}
评论
硬件加速器的禁用会带来严重的性能损失,就我而言,我发现在 Kitkat 中,当我在已完成并随后重新启动的活动中重新实例化 webview 元素时,这种情况发生在我身上。 经过大量的反复试验,当我添加:
RelativeLayout layout = (RelativeLayout) findViewById(R.id.webViewContainer);
layout.removeAllViews();
webview.destroy();
就在结束活动之前,它似乎已经解决了问题。我还没有在许多设备上测试过它,但如果这个解决方案是正确的,那么它比禁用 KitKat 的硬件加速要好得多。
评论