名前がわかっている場合、画像のリソースIDを取得するにはどうすればよいですか?


回答:


269

このようなもので:

String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());

10
おかげで、同様の問題の解決策を見つけることができました!getResources().getIdentifier(name, "id", getPackageName());(R.id.nameの場合と同様に)ImageButtonのIDを取得するために使用します。
Select0r

42
ドローアブル名には「.png」のような拡張子を含めないでください
larham1

1
変数には正確に何が入りますnameか?参照がわかっているボタンのIDを検索したいのですが、私の場合はそうですbutton1
John Watson

1
getResource()getPackageName()エラーを示しています。cannot resolve method
Srujan Barai 2015

@Srujan Barai、getResource()およびgetPackageName()Activityのメソッドです。
ベルガ

29

これを試すこともできます:

try {
    Class res = R.drawable.class;
    Field field = res.getField("drawableName");
    int drawableId = field.getInt(null);
}
catch (Exception e) {
    Log.e("MyTag", "Failure to get drawable id.", e);
}

以下のURLからこのソースコードをコピーしました。このページで行われたテストに基づくと、getIdentifier()より5倍高速です。また、使いやすく使いやすいこともわかりました。それがあなたにも役立つことを願っています。

リンク: Androidでリソースを動的に取得する


2
これはより高速かもしれませんが、プロガードを使用すると問題が発生する可能性があることがわかりました。これは少なくとも私にとってプロガードでは機能しませんでした
ペドロ・

一般的な例外をキャッチすることは、特に悪い考えです。さらに、ドローアブルへのハード参照がない場合、どこでも使用されているとは考えられないため、Proguardは参照を最適化する可能性があることに注意してください。
Paul Lammertsma 2013年

私は今理解しています:)あなたは、最適化中に、私が正しい場合、このメソッドを使用してdrawableNameの変更とリソースを見つけることができないことを意味しますか?:)
VSB 2013年

1
@VSB:最後のコメントがすぐ上のPaul Lammertsmaコメントへの応答である場合:いいえ、彼はこれがリソースへの参照であることをProguardが認識していないことを意味し、リソースが使用されていないと信じてリソースを削除する可能性があります。
ToolmakerSteve、2015年

xxxxhdpi、xxhdpiなどを使用すると、このメソッドの有用性は低下します
Someone Somewhere

11

パブリックシステムリソースの例:

// this will get id for android.R.drawable.ic_dialog_alert
int id = Resources.getSystem().getIdentifier("ic_dialog_alert", "drawable", "android");

アラート

別の方法は、android.R.drawableクラスのドキュメントを参照することです。


1
@Milaaaadどういう意味ですか?
naXa 2016年

これは、コード内のリソースに混乱し、非アクティビティクラスで使用することを意味します
Milaaaad

1
@Milaaaadこのメソッドはシステムリソース用です。それらはコンテキストに依存しません。
naXa

10

この関数を使用して、リソースIDを取得できます。

public static int getResourseId(Context context, String pVariableName, String pResourcename, String pPackageName) throws RuntimeException {
    try {
        return context.getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
    } catch (Exception e) {
        throw new RuntimeException("Error getting Resource ID.", e)
    } 
}


したがって、Drawable Resource ID を取得したい場合は、次のようにメソッドを呼び出すことができます。

getResourseId(MyActivity.this, "myIcon", "drawable", getPackageName());

(またはフラグメントから):

getResourseId(getActivity(), "myIcon", "drawable", getActivity().getPackageName());


以下のために文字列リソースIDあなたはこのようにそれを呼び出すことができます。

getResourseId(getActivity(), "myAppName", "string", getActivity().getPackageName());

等...


注意:リソースIDが見つからない場合は、RuntimeExceptionがスローされます。本番環境では適切に回復してください。

これを読む


4
私はあなたがstaticそこから削除する必要があると思います、さもなければgetResources()うまくいきません。
Richard Le Mesurier 2014年

@リチャード・ル・メズリエ、理由を説明してもらえますか?ありがとうございました。
Veer

1
@ Leo.Han私がそのコメントをしたとき、それContextは利用できませんでした。修正は、それを削除staticしてContext(たとえばActivityまたはApplication)に移動することでした。または代替の修正は、ジョナサンが彼の編集で行ったContextもので、メソッドに渡されます。
Richard Le Mesurier 2016

1
@Richard Le Mesurier、私は今編集履歴を確認しました、それはあなたが言ったことと同じです、何年も後にあなたの親切な返信に感謝します:)
Veer

0

私が遭遇したもう1つのシナリオ。

String imageName = "Hello"の場合、最初の引数としてgetIdentifier関数に渡されると、名前が文字列null終了で渡され、常にゼロが返されます。このimageName.substring(0、imageName.length()-1)を渡します

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