Android KitKat中的WebView渲染问题

时间:2013-12-19 07:14:57

标签: android webview chromium android-4.4-kitkat

我一直在开发一个具有WebView的应用程序,其中从资源加载静态页面(也使用JavaScript)。此WebView在KitKat中不起作用,它仍然是空白的。我知道渲染引擎(webkit到chrome)的变化发生在kitkat中的WebView中,并尝试了迁移的步骤,这在Android开发者页面中给出。但它没有帮助。

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

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

请建议解决方法。

5 个答案:

答案 0 :(得分:43)

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

从谷歌搜索,似乎是因为Chromium WebView不支持硬件加速画布渲染。我将此行添加到WebView以关闭硬件加速画布,现在它可以正常工作。

mWebview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

答案 1 :(得分:6)

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

body {
  background: white;
}

事实证明,如果你没有明确地为网页设置背景,那么WebView将无法绘制所述背景,你最终会得到一个透明的WebView。

答案 2 :(得分:4)

这似乎是一个铬webview bug。

以下是关于此问题的主题:https://jira.appcelerator.org/browse/TIMOB-16479

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

答案 3 :(得分:0)

禁用硬件加速器带来了沉重的性能损失。在我的情况下,我发现在Kitkat中,当我在一个已完成并稍后重新启动的活动中重新实例化webview元素时,这发生在我身上。 经过大量的反复试验,当我补充说:

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

在结束活动之前,它似乎已经解决了问题。我还没有在很多设备上测试它,但是如果这个解决方案合适,那么远比为webview禁用KitKat的硬件加速更好。

答案 4 :(得分:-2)

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

}