2015年10月3日土曜日

Android開発 getColor(int id) deprecated on Android 6.0 Marshmallow (android sdk 23)

  • 公開日:2015年10月03日
  • 最終更新日:2016年01月29日

記事概要

Androidのsdk 23でgetColorが非推奨になったので、その対策方法の記載です。

環境

  • Android Studio 1.3.0
  • OS X Yosemite
  • android sdk 23(Android 6.0 Marshmallow(マシュマロ))

はじめに

毎年秋は、好例のandroidアップデートの時期です。新しいsdkのバージョン対応をしていくのにも随分と慣れてきました。
最初の頃はandroidの進化の速度についていくのはしんどかったのですが、今は当たり前になってしまいました。
人間慣れるものです。
というわけで今回は、非推奨になったgetColorメソッドの変更方法です。

getColor

sdk22までは、コード内でTextViewの文字色を変更する場合は以下のように記載していました。

java code

            switch (calendar.get(Calendar.DAY_OF_WEEK)) {
                case Calendar.SUNDAY:
                    viewHolder.getTimeLabel().setTextColor(mContext.getResources().getColor(R.color.red));
                    break;
                case Calendar.SATURDAY:
                    viewHolder.getTimeLabel().setTextColor(mContext.getResources().getColor(R.color.blue));
                    break;
                default:
                    viewHolder.getTimeLabel().setTextColor(mContext.getResources().getColor(R.color.black));
            }

上記は、カレンダーの土曜と日曜でテキストの色を変更しているコードです。
mContext.getResources().getColor(R.color.black)を呼び出して、TextViewの文字色を変更しています。

しかし、sdk23からはgetColorメソッドが非推奨になり、この部分はdeprecatedで表示されてしまいます。

ContextCompat.getColor

sdk23からはgetColorが非推奨になり、ContextCompat.getColorを使うようになりました。修正は以下のようにします。

java code

            switch (calendar.get(Calendar.DAY_OF_WEEK)) {
                case Calendar.SUNDAY:
                    viewHolder.getTimeLabel().setTextColor(ContextCompat.getColor(mContext, R.color.red));
                    break;
                case Calendar.SATURDAY:
                    viewHolder.getTimeLabel().setTextColor(ContextCompat.getColor(mContext, R.color.blue));
                    break;
                default:
                    viewHolder.getTimeLabel().setTextColor(ContextCompat.getColor(mContext, R.color.black));
            }

上記を記載することで、deprecatedの警告が消えます。
ContextCompat.getColorメソッドの実際のコードの中身は以下のように実装されています。

java code

public static final int getColor(Context context, int id) {
    final int version = Build.VERSION.SDK_INT;
    if (version >= 23) {
        return ContextCompatApi23.getColor(context, id);
    } else {
        return context.getResources().getColor(id);
    }
}

どうして振る舞いを変えたのかはわかりませんが、これからはContextCompat.getColorを使ったほうが良さそうです。

まとめ

Android 6.0 Marshmallow (android sdk 23)からは
getColorではなくContextCompat.getColor
を使いましょう。

技術的負債の返却はお早めに。

以上です

PICK UP オススメ開発用製品

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

11 件のコメント:

Related Posts Plugin for WordPress, Blogger...