2013-12-19 69 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的硬件加速。