組み込みエンジニアのアプリ日誌

Shekeen Lab.のAnroidアプリ開発記

deprecatedなResources.getDrawableメソッドを置き換える

先日Android SDKバージョン 22 (Lollipop MR1)に上げたところ、Resources.getDrawable(int id)がdeprecatedになってしまいました。APIリファレンスを見ると、代わりに以下のAPIを呼ぶように書かれていました。

public Drawable getDrawable (int id, Resources.Theme theme)

Themeが引数に加わっています。正直、ActivityからDrawableを呼び出すときにわざわざ別のテーマを渡す必要性がわかりませんでした。また、引数に何を渡すべきか悩んでいたところ、Contextクラスに以下のAPIを発見しました。

public abstract class Context {
    ・・・
    public final Drawable getDrawable(int id) {
        return getResources().getDrawable(id, getTheme());
    }

Context.getDrawableはAPIレベル21で追加されたメソッドです。したがって、最小ビルドバージョンを20以下に設定している場合、呼び分ける必要があります。結局、以下のようなメソッドをActivityクラスの派生クラスに追加し、そのメソッド経由でDrawableを取得することで、問題を回避することにしました。

class MainActivity extends Activity {
・・・
    @SuppressWarnings("deprecation")
    public Drawable getDrawableResource(int id){
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
            return getDrawable(id);
        }
        else{
            return getResources().getDrawable(id);
        }
    }

最初はContext.getDrawableをオーバーライドしようと思ったのですが、finalということで、メソッド名称をgetDrawableResourceとしました。
以上です。