2013-12-19 71 views
36

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

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

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

请提出一个解决办法。

+0

请使硬件加速关闭。 Chromium WebView不支持硬件加速画布渲染。 – JiTHiN

+0

试图禁用WebView的硬件加速,但它也没有工作。 – gnuanu

+0

你能分享你正在加载的内容的更多细节吗?您是否尝试过使用远程调试来检查哪些内容被加载到WebView中? (https://developers.google.com/chrome-developer-tools/docs/remote-debugging#debugging-webviews) – ksasq

回答

42

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

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

mWebview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
+0

男人,你救了我的命 – edoardotognoni

+0

这也加快了我的初始化时间。我在ViewPager中有几个Web视图,当切换页面然后弹出视图时,这往往会显示为空白。使用软件渲染帮助了很多。 –

+33

这对我不起作用 –

6

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

body { 
    background: white; 
} 

事实证明,如果你不明确地为某个网页上的WebView将无法画说背景的背景,你会得到一个透明的WebView结束。

+17

这对我不起作用 – sguha

4

这似乎是一个铬webview错误。

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

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

+0

无论接受的答案是否可以解决,但它确实对我有用,而且仍然没有任何问题。 – gnuanu

+0

当然。我的评论仅仅意味着对其他用户不起作用的帮助。接受的答案并没有解决我的问题。 –

+5

接受的答案没有适用于我 –

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

} 
+2

请添加一些解释! – TechSpellBound

0

硬件加速器的禁用带有沉重的性能代价,对我来说,我发现,在奇巧这发生在我身上,我再次说已经完成,以后重新启动活动中实例化的WebView元素时。 大量的试验和错误,当我加入后:

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

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