Android KitKat中的WebView呈现问题

我一直在一个应用程序有一个WebView的静态页面从资产加载(也使用JavaScript)。 这个WebView不能在KitKat中工作,它仍然是空白的。 我意识到在kitkat中WebView中发生的渲染引擎(webkit to chromium)的变化,并尝试了在Android Developers页面中给出的迁移步骤。 但是没有帮助。

在logcat中,我收到了一个来自Chromium源的错误。

W/AwContents﹕ nativeOnDraw failed; clearing to background color.

请build议一种解决方法。

在我的情况下,在Android 4.4,我得到一个黑色的背景,无论我设置什么和这个错误消息在我的LogCat:nativeOnDraw失败; 清除到背景颜色。

从谷歌search,这似乎是因为硬件加速canvas渲染不支持在Chromium WebView中。 我把这一行添加到WebView来closures硬件加速canvas,现在它工作。

 mWebview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

我遇到了同样的问题,但我find了解决方法。 你所要做的就是明确地为你的网页设置一个CSS背景。 像这样:

 body { background: white; } 

事实certificate,如果您没有为网页显式设置背景,那么WebView将无法绘制所述背景,最终会生成透明的WebView。

这似乎是一个铬webview错误。

这是关于这个问题的一个线索: https : //jira.appcelerator.org/browse/TIMOB-16479

显然,接受的答案不是一个确定的解决scheme。 链接中提到了解决方法。

硬件加速器的禁用带来了巨大的性能损失,在我的情况下,我发现在奇怪的事情发生在我实例化webview元素内的一个活动已完成,后来重新启动。 经过大量的试验和错误,当我补充说:

 RelativeLayout layout = (RelativeLayout) findViewById(R.id.webViewContainer); layout.removeAllViews(); webview.destroy(); 

在结束活动之前,似乎已经解决了问题。 我还没有在很多设备上testing过,但是如果这个解决scheme是正确的,那么最好还是禁用webview的KitKat的硬件加速。

 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); } }