Android getResources()。getDrawable()非推奨のAPI 22


699

新しいandroid API 22 getResources().getDrawable()で非推奨になりました。現在、最善の方法はのみを使用することですgetDrawable()

何が変わったの?


ご質問をお聞かせください。getDrawable (int id)クラスのメソッドResourcesが廃止されているのは当然です。ここgetDrawable (int id, Resources.Theme theme)で、新しいテーマパラメータを使用してメソッドを使用する必要があります。
コードモンキー

1
ContextCompat.getDrawable(context、R.color.color_name)
Ashokchakravarthi Nagarajan

この件についての私のブログ投稿で、両方Resources#getDrawable(int)Resources#getColor(int)非推奨の理由の詳細を確認できます。
Alex Lockwood

1
Googleは廃止された関数ごとにクイックフィックスを配置する必要があります。私はそれについてここに投稿しました:code.google.com/p/android/issues/detail?id
android developer

回答:


1027

ロードしているドローアブルの種類に応じて、この非推奨を正しい(そして将来の証明)方法で処理するためのいくつかのオプションがあります。


A)ドローアブルテーマ属性は、

ContextCompat.getDrawable(getActivity(), R.drawable.name);

アクティビティテーマの指示に従って、スタイル付きのDrawableを取得します。これはおそらく必要なものです。


B)テーマ属性のないドローアブル

ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);

古い方法で、スタイルのないドローアブルを取得します。注意:ResourcesCompat.getDrawable()は非推奨ではありません!


EXTRA)別のテーマのテーマ属性を持つドローアブル

ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);

アプリは提案Bを使用してクラッシュします。呼び出しDrawableは好きではありませんoriginalIcon = ResourcesCompat.getDrawable(ctxt.getResources()、iconResId、null);
FractalBob

このように宣言します。public static void setImageButtonEnabled(Context ctxt、boolean enabled、ImageButton item、int iconResId){item.setEnabled(enabled); Drawable originalIcon = ResourcesCompat.getDrawable(ctxt.getResources()、iconResId、null); 描画可能なアイコン=有効?originalIcon:convertDrawableToGrayScale(originalIcon); item.setImageDrawable(icon); 次のように呼び出します:Utility.setImageButtonEnabled(getContext()、false、back、R.drawable.arrow_left);
FractalBob

もっと正確に言えば、私のアイコンはベクターのドローアブルなので、クラッシュが起こっているようです。
FractalBob

1
xamarinバージョン:ResourcesCompat.GetDrawable(Resources、Resource.Drawable.name、null);
ブライアン、

さらに1単語追加します、ContextCompat.getColor(context、color)も役立ちます...
BertKing

746

編集:より完全な説明については、件名に関する私のブログ投稿を参照しください


代わりに、サポートライブラリの次のコードを使用してください。

ContextCompat.getDrawable(context, R.drawable.***)

このメソッドを使用することは、以下を呼び出すことと同じです。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

API 21以降では、getDrawable(int, Theme)メソッドをの代わりに使用する必要getDrawable(int)があります。これにより、指定された画面密度/テーマの特定のリソースIDに関連付けられた描画可能なオブジェクトをフェッチできます。非推奨のgetDrawable(int)メソッドを呼び出すことは、を呼び出すことと同じgetDrawable(int, null)です。


8
OP getDrawable (int id)Contextクラスのメソッドも指すと思います。これはgetResources().getDrawable(id, getTheme());新しいAPIと同じで、新しいAPIを使用しています。
コードモンキー

9
ドキュメントによると、を使用するには最小APIレベル21が必要ですgetDrawable(int, Resources.Theme)
プリンス

@PrinceメソッドはAPI 21で追加されましたが、API 22まで非推奨になりませんでした。:)
Alex Lockwood

AndroidドキュメントではContext :: getDrawable(int)メソッドの使用も推奨していますが、API 21でのみ導入されたため、ContextCompatが最良の選択のようです。
goRGon 2016年

この回答は、API 21より古いバージョンの.svgファイルでは機能しません。ライブラリにバグがあります。
ホルヘロドリゲス

141

この行を置き換えます: getResources().getDrawable(R.drawable.your_drawable)

ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)

編集する

ResourcesCompatも非推奨になりました。しかし、あなたはこれを使うことができます:

ContextCompat.getDrawable(this, R.drawable.your_drawable)(ここthisにコンテキストがあります)

詳細については、このリンクをたどってください:ContextCompat


2
それも今は値下げしました:plus.google.com/+BenjaminWeiss/posts/M1dYFaobyBM
Xyaren


2
それはで言っていないリンクをResourcesCompat推奨されていません。正常に動作するはずです。
ジェイコブR

ドローアブルに保存されているリストアイテムのクリック時にリストビューに画像を入力したい場合、「your drawable」に何を書き込むか
0x0001

29

getResources().getDrawable() APIレベル22で廃止されました。次に、テーマを追加する必要があります:

getDrawable(int id、Resources.Themeテーマ) (APIレベル21で追加)

これは例です:

myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));

これは、以降のバージョンを検証する方法の例です。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
     myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
   } else { 
     myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage));
}

Build.VERSION_CODES.LOLLIPOP is API 21、これはそうではありませんif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)?気にしないで。以下から「メソッドはAPI 21で追加されましたが、API 22までは非推奨ではありませんでした。:)」
Mark Cramer

2

使用できます

ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);

それは私にとっては仕事です


プリロリポップでアプリケーションコンテキストを使用してベクタードローアブルをロードするとクラッシュする。これに対する修正はありますか?
muthuraj 2018

1
@muthurajロリポップのケースでコードをテストしたことは覚えていませんが、代わりにgetActivity()またはgetResources()を試すことができます。
Dasser Basyouni 2018

私はMVVMパターンを使用しており、アクティビティコンテキストを持たないViewModels内のドローアブルを拡張する必要があります。アプリケーションコンテキストのみが含まれます。それが私の問題です。
muthuraj 2018

1

配列の問題を修正してlistViewをロードする方法のほんの一例です。

 mItems = new ArrayList<ListViewItem>();
//    Resources resources = getResources();

//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.az_lgo), getString(R.string.st_az), getString(R.string.all_nums)));
//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.ca_lgo), getString(R.string.st_ca), getString(R.string.all_nums)));
//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.co_lgo), getString(R.string.st_co), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.az_lgo, null), getString(R.string.st_az), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.ca_lgo, null), getString(R.string.st_ca), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.co_lgo, null), getString(R.string.st_co), getString(R.string.all_nums)));

1

これを試して:

public static List<ProductActivity> getCatalog(Resources res){
    if(catalog == null) {
        catalog.add(new Product("Dead or Alive", res
                .getDrawable(R.drawable.product_salmon),
                "Dead or Alive by Tom Clancy with Grant Blackwood", 29.99));
        catalog.add(new Product("Switch", res
                .getDrawable(R.drawable.switchbook),
                "Switch by Chip Heath and Dan Heath", 24.99));
        catalog.add(new Product("Watchmen", res
                .getDrawable(R.drawable.watchmen),
                "Watchmen by Alan Moore and Dave Gibbons", 14.99));
    }
}

このコードは質問に答えることがありますが、このコードが質問に答える理由および/または方法に関する追加のコンテキストを提供すると、その長期的な価値が向上します。
ドナルドダック


1

getDrawable(int drawable)は、APIレベル22で廃止されました。参照については、このリンクを参照してください

この問題を解決するには、次のようにIDとともに新しいコンストラクターを渡す必要があります。

getDrawable(int id, Resources.Theme theme)

ソリューションの場合、次のようにします:-

Javaの場合:-

ContextCompat.getDrawable(getActivity(), R.drawable.name);   

または

 imgProfile.setImageDrawable(getResources().getDrawable(R.drawable.img_prof, getApplicationContext().getTheme()));

コトリンでは:-

rel_week.background=ContextCompat.getDrawable(this.requireContext(), R.color.colorWhite)

または

 rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)

これがあなたに役立つことを願っています。


言及する価値があります。getDrawable(DrawableRes int id、Theme theme)は、リソースが見つからない場合に例外をスローできますが、getDrawable(Context context、int id)はnullにできるため、Drawableで返す必要がありますか?コトリンで。
ピトス


0

今、あなたはこのように実装する必要があります

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
        //
    } else {
        //
    }

次の1行のコードで十分ですが、ContextCompat.getDrawableによってすべてが処理されます。

ContextCompat.getDrawable(this, R.drawable.your_drawable_file)

0

このスレッドの提案を適用した後でもこの問題を解決できる人のために(私は以前はそのようなものでした)、アプリケーションクラスのonCreate()メソッドにこの行を追加します

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)

ここここで提案されているように、特にメニュー項目を扱う場合など、リソースからベクターにアクセスするためにこれが必要になる場合があります


0

Kotlinでは拡張機能を使用できます

fun Context.getMyDrawable(id : Int) : Drawable?{

    return  ContextCompat.getDrawable(this, id)
}

それから

context.getMyDrawable(R.drawable.my_icon)

-2

Build.VERSION_CODES.LOLLIPOPをBuildVersionCodes.Lollipopに変更する必要があります。つまり、

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) {
    this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder, Context.Theme);
} else {
    this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder);
}

BuildVersionCodesXamarinに固有のクラスではありませんか?
Ted Hopp、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.