WebView Rendering Issue в Android KitKat

Я работал над приложением, у которого есть WebView, в котором статическая страница загружается из активов (также используя JavaScript). Этот WebView не работает в KitKat, он остается пустым. Я знаю об изменениях в движке рендеринга (webkit to chromium), который произошел в WebView в kitkat, и попробовал шаги для миграции, которые приведены на странице Android Developers. Но это не помогло.

В logcat я получаю ошибку, которая выбрасывается из источника Chromium.

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

Попробуйте обходной путь.

Solutions Collecting From Web of "WebView Rendering Issue в Android KitKat"

В моем случае, в Android 4.4, я получал черный фон независимо от того, что я установил, что и это сообщение об ошибке в моем LogCat: nativeOnDraw не удалось; Очистка цвета фона.

Из Googling это похоже на то, что аппаратный ускоренный рендеринг холста не поддерживается в Chromium WebView. Я добавил эту строку в WebView, чтобы отключить аппаратное ускоренное полотно, и теперь оно работает.

 mWebview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

Я столкнулся с тем же вопросом, но нашел способ обхода. Все, что вам нужно сделать, это явно установить фон CSS для вашей веб-страницы. Вот так:

 body { background: white; } 

Как выясняется, если вы явно не устанавливаете фон для веб-страницы, WebView не сможет нарисовать указанный фон, и вы получите прозрачный WebView.

Это кажется ошибкой веб-браузера хрома.

Вот вопрос о проблеме: https://jira.appcelerator.org/browse/TIMOB-16479

По-видимому, принятый ответ не является верным решением. Обходной путь упоминается в ссылке.

Отключение аппаратного ускорителя связано с большими потерями производительности. В моем случае я узнал, что в Kitkat это произошло со мной, когда я повторно создавал элемент webview в рамках действия, которое было закончено и позже перезапущено. После большого количества проб и ошибок, когда я добавил:

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

Как раз перед прекращением деятельности, похоже, проблема решена. Я еще не тестировал его на многих устройствах, но если это решение является правильным, то это намного лучше, чем отключить аппаратное ускорение для 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); } }