2016-11-09 7 views
0
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linear); 
int color = ContextCompat.getColor(getContext(), mColorResourceId); 
linearLayout.setBackgroundColor(color); 

iは、コードのこれらの行があります。それは保持します mColorResourceIdR.color.category_numbers - >は、ContextCompatクラスのgetColor()メソッドを使用する主な理由を説明していますか?

私はmColorResourceId直接それがint値を受け入れる方法にもかかわらず、色を変更しないのですsetBackgroundColor(mColorResourceId);に渡しmColorResourceId = R.color.category_numbers

私の質問なぜこの余分なステップが必要ですか?int color = ContextCompat.getColor(getContext(), mColorResourceId);色を変更するには?

+0

リソースから色を設定したい場合、他の開発者は、Javaで色をハードコードしたり、ファイル/データベースから色をロードしたり、Webサービスの応答の一部として色を取得することができます、またはランダムに色を選択します。したがって、 'setBackgroundColor()'は、色のリソースIDだけでなく、* color *を取ります。 – CommonsWare

答えて

3

setBackgroundColor()メソッドは、aarrggbb形式の色値であると考えられるintを受け入れます。リソースID R.color.category_numbersintですが、色の値ではありません。代わりにcolorリソースの識別子です。 ContextCompat.getColor(getContext(), mColorResourceId)を呼び出すと、mColorResourceIdに対応する実際のカラー値が取得されます。

Androidのこの種の間接指定は、柔軟性を提供するための理由の一部です。返される実際の色は、現在のテーマまたはデバイスの設定に依存し、実行時に実際に変更される場合があります(カラーリソースの宣言方法によって異なります)。

+0

なぜmColorResourceIdでgetContext()を渡すのですか?なぜ私は必要でしたか? –

+0

@ AndroidAL-Khatib - これは、取り出された色が現在のテーマに敏感であるようにするためです。例えば、あなたのカラーリソースを '?attr/some_theme_color_name'と定義し、独自のテーマプロパティ 'some_theme_color_name'を定義したとします。 Android Marshmallow以降では、 'ContextCompat.getColor()'は渡されたコンテキストのテーマセットを使用して色をルックアップします。 –

+0

ありがとうalot((: –

関連する問題