背景
私が管理した限りでは、Android開発の初心者は、必ずこの不具合に直面し、混乱を極めていた。
例えば、これ。
TextView.setTextColor(int color)
なんてことない、テキストの文字色を変更するだけのことなのだが、Android開発の初心者は、皆、こう↓やってしまい、何時間もハマってしまう、色が変わんねーよ、、、と。
mTextView.setTextColor(R.color.colorAccent);
まあ、こう↑やってしまう理由も分かる。
何故なら、xml上で定義する際に、こう↓なっているからだ。
<TextView
android:textColor="@color/colorAccent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
意味も分からずコードの「見た目」だけで覚えてしまうと、なんとなく似ているからと思って、やってしまうようだ。
setTextColor(R.color.colorAccent);
textColor="@color/colorAccent"
気持ちは分かる、ちょっとした罠だと思う。
引数「int color」は「リソースID」ではない
mTextView.setTextColor(R.color.colorAccent);
この実装だと、引数に「リソースID」を渡していることになってしまう。
「R.color.xxx」というのは、その名前(xxx)で定義されたリソースの在処、「リソースID」を示しているに過ぎない。
引数「int color」は、「リソースID」を求めているのではなく、「色を表現する値」を求めている。
サンプルコード(4パターン)
以下の「pattern 1」を見てもらえれば、引数に何を求められていたのかが、よく分かると思う。
// set color pattern 1
mTextView.setTextColor(0xff536dfe);
// set color pattern 2
mTextView.setTextColor(Color.parseColor("#536dfe"));
// set color pattern 3
mTextView.setTextColor(ContextCompat.getColor(this, R.color.colorAccent));
// set color pattern 4
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mTextView.setTextColor(getColor(R.color.colorAccent));
}
(※「minSdkVersion 21:Lollipop」を前提としたサンプルコード)
関連記事
【Android】「NavigationView(ドロワーメニュー)」の「アイコンの色」を変更する
(※この記事の抜粋から本内容は構成)