18

たくさんの画面を持つアプリを構築しています。ほとんどの画面には、上部に背景色のビューがあります。

view.setBackgroundColor(color) を使用してその色を変更することがよくあります

ここで奇妙なことがあります: 1 つのビューの色を設定した後、たとえば #f14fb7 にアプリ内を移動するときに、他のビューの背景が意図せずにその色に設定されることがあります。id を設定していないビューでも発生することがあるため、それらのビューで setBackgroundColor を呼び出す方法はありません。

これはめったに発生せず、私が試したどのフローとも一致しません。

アプリを強制終了して再起動すると、すべてが正常に機能します。

私の唯一の推測は、メモリリークの王様ですが、もっと簡単な説明があることを願っています.

誰かがこれが起こる理由を考えることができますか?

*Galaxy S3 で発生します。

4

3 に答える 3

15

コードがなければ簡単ではありません...しかしColorDrawable、複数のビューで同じものを再利用していると思いますView.setBackgroundColor()。ソースコードを見ると:

public void setBackgroundColor(int color) {
    if (mBGDrawable instanceof ColorDrawable) {
        ((ColorDrawable) mBGDrawable).setColor(color);
    } else {
        setBackgroundDrawable(new ColorDrawable(color));
    }
}

ColorDrawableの色が変わり、毎回新しい色が作成されないことがわかります。これが、あなたがこの奇妙な行動をしている理由だと確信しています。

編集

xml で初期背景色を設定すると、これandroid:backgroundが実行されます ( android docによると):

背景を特定のリソースに設定します。リソースは Drawable オブジェクトを参照する必要があります

私の理解によれば、それはView.mBGDrawableインフレ中にフィールドを設定します。View.setBackgoundDrawable(new ColorDrawable(the_color_int_code)))の代わりに使用することをお勧めしますsetBackgroung(the_color_int_code)。それはあなたの問題を解決するはずです。

于 2013-02-14T12:46:16.600 に答える
6

これは通常、xml で色が設定されているビューがある場合に発生します。例:

android:background="@color/cyan" 

これで内部的に新しいものが作成されます -そのビューのクラス内でColorDrawableそれを呼び出しましょう。conceptual_drawable_cyan同じビューにプログラムで別の色が割り当てられると、次のようになります。

view.setBackgroundColor(newColor);

内部的には、別のドローアブルを作成する代わりに、このビューを に設定newColordrawable_cyanます。したがって、この時点から、どこでも使用する場合

android:background="@color/cyan" 

ビューは実際に で使用conceptual_drawable_cyannewColorます。

解決:

setBackgroundColorを使用してプログラムで色を設定する代わりに、次を使用します。

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        view.setBackground(new ColorDrawable(newColor));
    } else {
        view.setBackgroundDrawable(new ColorDrawable(newColor));
    }
于 2015-05-26T10:25:44.157 に答える
1

「values」フォルダーの下に「colors.xml」ファイルを作成します。例:

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="pink">#f14fb7</color></resources>

使用するview.setBackgroundResource(R.color.pink);

于 2013-09-07T21:16:23.743 に答える