2013-02-14 4 views
15

私はたくさんの画面を持つアプリケーションを構築しています。 ほとんどの画面には、背景色の上にViewがあります。時には1つのビューの色を設定した後、#f14fb7、アプリでナビゲートし、他のビューの背景に言う:Androidは予期せずに背景の変更を表示します

私はよく

はここで奇妙なことが来るview.setBackgroundColor(色)を使用して、その色を変更します私がそれらを望んでいないで、その色に設定されています。 idを設定していないビューが時には表示されることもあります。そのため、これらのビューに対してsetBackgroundColorが呼び出される方法はありません。

これはまれであり、私が試したフローと一貫していません。

私がアプリを終了して再起動すると、すべて正常に動作します。

私は唯一のメモリリークの王ですが、私はより簡単な説明があることを願っています。

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

*私のGalaxy S3で発生します。

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

あなたはそれを変更することを見ることができます:それは簡単ではありません...しかし、私はあなたが複数のビューで同じColorDrawableを再利用していて、View.setBackgroundColor()ソースコードを見てみた場合に推測コードなし

+2

私たちはあなたが上にあなたの画面とビューをレイアウトしているかを正確に理解するためのいくつかのコードを参照する必要があります。 –

+0

あなたは、色の最も外側の背景を持っている可能性がありますし、背景に透明または何か他のレイアウトがありますか? – Nezam

+0

投稿するコードはありません。これはアプリ全体で発生するためです。 Nezam、それはそうではありません...この問題が発生しない時間は95%です。 背景を設定するコードはview.setBackgroundColor(color)...何も特別なものではありません。 奇妙なことは、その特定の画面とは何の関係もない他の画面に影響するということです...それがメモリリークだと思われる理由です。 – dors

答えて

13

色はColorDrawableであり、毎回新しいものを作成しないでください。私はこれがあなたがこの奇妙な振る舞いをしている理由だと確信しています。

EDIT

あなたはandroid:backgroundとXMLで最初の背景色を設定は、あなたがこれをやっている(android docに従って):

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

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

+0

なぜ私は複数のビューで同じColorDrawableを使用すると思いますか? ソースコードでわかるように、私が行うのはcolor(int)を渡すことだけで、Viewクラスは必要に応じて新しいColorDrawableインスタンスを作成しました。 さらに、このストラギング動作が発生すると、ビューの色をデバッグすると、実際に別の色が表示されているときに正しい色が設定されているように見えます。 – dors

+0

私の提案を検証するかどうかを確認する:デバッグ時に、2つのビューの 'mBGDrawable'の参照が誤って同じ背景を表示することに注意してください。これが同じ参照であれば、私の提案は正しい。 – ben75

+0

あなたが正しい場合、どうすればこの問題を解決できますか?私は、新しいColorDrawableインスタンスを作成するのではなく、Viewクラスがそれを行います – dors

1

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

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

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

5

これは通常、あなたがその色のxml元に設定されているビューがある場合が起こる:

android:background="@color/cyan" 

を今これは内部的に新しいColorDrawableを作成する - それを呼び出すことができますconceptual_drawable_cyanそのビューのクラス内にあります。

view.setBackgroundColor(newColor); 

を内部代わりに、それはdrawable_cyanこのnewColorを設定異なる描画可能作成のこのビューを:今ときに同じビューを使用してプログラム的に異なる色が割り当てられます。したがって、この時点から以降、あなたはどこにでも

android:background="@color/cyan" 

を使用する場合、ビューは、実際にnewColorconceptual_drawable_cyanを使用します。

ソリューション:

代わりに、プログラムで使用する色を設定するsetBackgroundColorを使用する:

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
     view.setBackground(new ColorDrawable(newColor)); 
    } else { 
     view.setBackgroundDrawable(new ColorDrawable(newColor)); 
    } 
関連する問題