web-dev-qa-db-ja.com

ハードウェアアクセラレーションが有効になっている場合(Android 3.0以降)、WebViewが白い背景で「点滅」する

WebView(Android 3.0+)に問題があります。WebViewは、黒い背景を表示する前に常に白い背景を表示します(「点滅」)。これが私の簡単なテストコードです。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    WebView webView = new WebView(this);
    webView.setBackgroundColor(Color.BLACK);
    setContentView(webView);
    loadWebView(webView);
    webView.loadDataWithBaseURL("localhost://", "<html><head>" +
            "<style>body {background-color: #000}img{max-width:100%}</style></head>" +
            "<body>" +
            "<img src=\"http://developer.Android.com/images/practices/actionbar-phone-splitaction.png\" />" +
            "</body></html>", 
            "text/html", "UTF-8", null);
}

この問題を取り除くために多くの解決策を試しましたが、幸運ではありません。

PS:ハードウェアアクセラレーションがオフの場合、問題は発生しません。誰かが同じ問題を抱えて解決しましたか?

ありがとうございました。

42
Tri Bui

私はこれに対する最も効果的な修正を見つけました 最初にここで述べた 、レイアウトが膨張した後に透明な背景色を設定することでした:

webView.setBackgroundColor(Color.argb(1, 0, 0, 0));

はい、それは完全なハックですが、ハードウェアアクセラレーションを無効にせずにうまく機能することがわかった唯一のソリューションです。

これは、XMLで背景を設定する際にnot動作することに注意してください。

これはJellybeanで解決されましたが、一部のユーザーはこれをKitKatで見ると報告しています。ハードウェアアクセラレーションを無効にしたnotを持っていることを確認します。問題が実際に解消された場合は、おそらく古いデバイスのみを対象とする条件文でそのコードをラップする必要があります。

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
    webView.setBackgroundColor(Color.argb(1, 0, 0, 0));
}
45
Paul Lammertsma

アプリケーションのハードウェアアクセラレーションを有効にし、アクティビティで無効にしました。さらに、上記のように、背景をnullに設定します。今はうまくいきます。

別のアプローチ(テストなし):レイヤータイプをソフトウェアレンダリングに設定し、背景を_Color.TRANSPARENT_(または_0_)に設定します:webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

グリーツ・トルステン

12
user640688

Android 4.4.4でこの問題があり、他のソリューションはどれも機能していませんでした。とにかくonPageFinished()をいじっていました。

これを、WebViewをホストするフラグメントのonCreateView()に入れます。

    webView = (WebView) v.findViewById(R.id.webView);
    webView.setVisibility(View.INVISIBLE);
    webView.setBackgroundColor(Color.argb(1, 0, 0, 0));         

    webView.setWebViewClient( new WebViewClient(){
        @Override
        public void onPageFinished(WebView view, String url) {
            view.setVisibility(View.VISIBLE);
            super.onPageFinished(view, url);
        }
    });

最初のページがロードされるまで、WebViewを非表示にするだけです。ただし、Paul Lammertsmaが提供するソリューションwebView.setBackgroundColor(Color.argb(1, 0, 0, 0));を追加するまでは、少し白く光っていました。

8
Magnus W

Android version> 3のひどい「機能」です。公式アプリGoogle Readerにもこの白いフラッシュが含まれています。解決策は、高速描画Webを使用する必要があるアクティビティのハードウェアアクセラレーションを無効にすることです。見る。

4
Jan Muller

Webビューでも同様の問題がありました。私はアイスクリームサンドイッチに取り組んでおり、minSdk = 13をAndroidマニフェストは私のために働いた。それを試してみてください。SDKにバグがあると思います。

0
Veljko

次のようにします。

WebView web=(WebView)findViewById(R.id.web);
web.setBackgroundColor(0xff000000);
0
PYK