リソースからDrawableを作成する方法


283

画像がありますres/drawable/test.png(R.drawable.test)。
この画像をDrawable、たとえばを受け入れる関数に渡したいのですがmButton.setCompoundDrawables()

では、どうすれば画像リソースをに変換できDrawableますか?

回答:


566

アクティビティにはメソッドgetResourcesが必要です。行う:

Drawable myIcon = getResources().getDrawable( R.drawable.icon );

2
たまたまこれをActivityクラスの外で使用したい場合は、getResources()が存在するContextに到達する別の方法を見つける必要があります。この答えはそれをコンストラクタに渡すことをお勧めします
rymo

50
APIバージョン21以降、このメソッドは廃止され、次のように置き換える必要があります。Drawable drawable = ResourcesCompat.getDrawable(getResources()、page.getImageId()、null);
2015

3
@BorenはContextCompat.getDrawable(this、R.drawable.icon);を使用するのと同じですか?
Zach

2
R.drawable.iconがベクター型ドローアブルの場合、上記の提案はどれも機能しないようです。
FractalBob

4
VECTOR DRAWABLEを使用している場合は、これを使用しないでください。代わりにAppCompatResources.getDrawable(context、R.drawable.icon)を使用してください。
Dhaval Patel、2018

136

このコードは廃止されました:

Drawable drawable = getResources().getDrawable( R.drawable.icon );

代わりにこれを使用してください:

Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.icon);

11
これにより、特定のコンテキストからテーマが適用されることに注意してください。テーマが使用されないようにしたい場合は、使用できますResourcesCompat.getDrawable(getResources(), R.drawable.icon, null);(3番目のパラメーターはオプションのThemeインスタンスです)。
vaughandroid 2016年

23

このgetDrawable (int id)メソッドは、API 22で非推奨になりました。

代わりにgetDrawable (int id, Resources.Theme theme)for API 21+を使用する必要があります

コードは次のようになります。

Drawable myDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    myDrawable = context.getResources().getDrawable(id, context.getTheme());
} else {
    myDrawable = context.getResources().getDrawable(id);
}

すべてのAPIにnullを渡さないのはなぜですか?さらに、nullが最良のオプションであると確信していますか?
jonathanrz

1
getDrawable(int型のID、Resources.Themeテーマ)API 21まで、約来ていない
クリススティルウェル

またはgetResources().getDrawable(R.drawable.ic_warning_80dp, context?.theme)
Simon Featherstone

13

getDrawable(...)を使用しているときに「非推奨」メッセージが表示される場合は、代わりにサポートライブラリの次のメソッドを使用する必要があることを追加します。

ContextCompat.getDrawable(getContext(),R.drawable.[name])

このメソッドを使用する場合、getResources()を使用する必要はありません。

これは次のようなことをするのと同じです

Drawable mDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    mDrawable = ContextCompat.getDrawable(getContext(),R.drawable.[name]);
} else {
    mDrawable = getResources().getDrawable(R.id.[name]);
}

これは、Lollipopの前バージョンと後バージョンの両方で機能します。


4

ベクトルリソースかどうかに関係なく、ベクトルリソースからDrawableを取得します。

AppCompatResources.getDrawable(context, R.drawable.icon);

注:ベクターリソース
ContextCompat.getDrawable(context, R.drawable.icon);を生成android.content.res.Resources$NotFoundExceptionします。


3

画像が設定されているビューからドローアブルを取得しようとしている場合、

ivshowing.setBackgroundResource(R.drawable.one);

その後、ドロアブルは次のコードでnull値のみを返します...

   Drawable drawable = (Drawable) ivshowing.getDrawable();

したがって、特定のビューからドローアブルを取得する場合は、次のコードを使用して画像を設定することをお勧めします。

 ivshowing.setImageResource(R.drawable.one);

そうして初めて、ドローアブルは正確に変換されます。


1

フラグメントから継承する場合は、次のことができます。

Drawable drawable = getActivity().getDrawable(R.drawable.icon)

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