LoginSignup
25
14

More than 5 years have passed since last update.

【Android】引数「int color」を設定する方法(4パターン)

Posted at

背景

私が管理した限りでは、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(ドロワーメニュー)」の「アイコンの色」を変更する

(※この記事の抜粋から本内容は構成)

25
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
14