Подтвердить что ты не робот

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.

Пожалуйста, предложите обходное решение.

4b9b3361

Ответ 1

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

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

mWebview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

Ответ 2

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

body {
  background: white;
}

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

Ответ 3

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

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

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

Ответ 4

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

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

Как раз перед прекращением действия, эта проблема решена. Я еще не тестировал его на многих устройствах, но если это решение является правильным, то это намного лучше, чем отключить аппаратное ускорение для KitKat для веб-просмотра.

Ответ 5

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 history
    if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
        webView.goBack();
        return true;
    }
    // If it wasn't the Back key or there no web page history, bubble up to the default
    // system behavior (probably exit the activity)
    return super.onKeyDown(keyCode, event);
}

}