いずれかのクラスのメソッドにリソースIDを渡す必要があります。参照が指すIDと文字列の両方を使用する必要があります。これを最もよく達成するにはどうすればよいですか?
例えば:
R.drawable.icon
これの整数IDを取得する必要がありますが、文字列 "icon"へのアクセスも必要です。
メソッドに渡す必要があるのは「アイコン」文字列だけの場合が望ましいでしょう。
いずれかのクラスのメソッドにリソースIDを渡す必要があります。参照が指すIDと文字列の両方を使用する必要があります。これを最もよく達成するにはどうすればよいですか?
例えば:
R.drawable.icon
これの整数IDを取得する必要がありますが、文字列 "icon"へのアクセスも必要です。
メソッドに渡す必要があるのは「アイコン」文字列だけの場合が望ましいでしょう。
回答:
@EboMike:私はそれがResources.getIdentifier()
存在することを知りませんでした。
私のプロジェクトでは、次のコードを使用してそれを行いました。
public static int getResId(String resName, Class<?> c) {
try {
Field idField = c.getDeclaredField(resName);
return idField.getInt(idField);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
R.drawable.icon
リソース整数値の値を取得するためにこのように使用されます
int resID = getResId("icon", R.drawable.class); // or other resource class
Resources.getIdentifier()
リフレクションを使用するよりも遅いというブログ投稿を見つけました。ご覧ください。
getIdentifier()
2つの反射ルックアップを実行する必要があります。上記の例でgetIdentifier()
は、リフレクションを使用してを取得しDrawable.class
、次に別のリフレクションルックアップを使用してリソースIDを取得します。それは速度の違いを説明します。そうは言っても、どちらも特に高速ではないため、実際にキャッシュする必要があります(特にループで使用する場合、またはの行に使用する場合ListView
)。また、リフレクションアプローチの大きな問題は、Androidの内部について、将来のリリースで変更される可能性があることを想定していることです。
context
パラメーターなのか?
この関数を使用して、リソースIDを取得できます。
public static int getResourceId(String pVariableName, String pResourcename, String pPackageName)
{
try {
return getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
したがって、このようなドローアブル呼び出し関数を取得したい場合
getResourceId("myIcon", "drawable", getPackageName());
文字列の場合は、次のように呼び出すことができます
getResourceId("myAppName", "string", getPackageName());
これは@Macarseの回答に基づいています。
これを使用して、リソースIDをより高速でコードに適した方法で取得します。
public static int getId(String resourceName, Class<?> c) {
try {
Field idField = c.getDeclaredField(resourceName);
return idField.getInt(idField);
} catch (Exception e) {
throw new RuntimeException("No resource ID found for: "
+ resourceName + " / " + c, e);
}
}
例:
getId("icon", R.drawable.class);
リソース名からアプリケーションリソースID を取得する方法は、よくあるよくある質問です。
リソース名からネイティブのAndroidリソースID を取得する方法はあまりよく答えられていません。以下は、リソース名でAndroidドローアブルリソースを取得するための私の解決策です。
public static Drawable getAndroidDrawable(String pDrawableName){
int resourceId=Resources.getSystem().getIdentifier(pDrawableName, "drawable", "android");
if(resourceId==0){
return null;
} else {
return Resources.getSystem().getDrawable(resourceId);
}
}
このメソッドは、他のタイプのリソースにアクセスするように変更できます。
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){ return mContext.getDrawable(resourceId); } else { return mContext.getResources().getDrawable(resourceId); }
を使用できますがResources.getIdentifier()
、XMLファイルで使用する文字列の形式を使用する必要がありますpackage:drawable/icon
。
getResourceEntryName(id)
して文字列名を検索します。長いテキストから「アイコン」を見つけるのにごちゃごちゃする必要はありません。
私はこれを好きでした、それは私のために働いています:
imageView.setImageResource(context.getResources().
getIdentifier("drawable/apple", null, context.getPackageName()));
Simple method to get resource ID:
public int getDrawableName(Context ctx,String str){
return ctx.getResources().getIdentifier(str,"drawable",ctx.getPackageName());
}
文字列からリソースIDを取得する簡単な方法。ここで、resourceNameは、XMLファイルにも含まれているドローアブルフォルダー内のリソースImageViewの名前です。
int resID = getResources().getIdentifier(resourceName, "id", getPackageName());
ImageView im = (ImageView) findViewById(resID);
Context context = im.getContext();
int id = context.getResources().getIdentifier(resourceName, "drawable",
context.getPackageName());
im.setImageResource(id);
getIdentifier
なければならないことがわかりましたid
。これは、Android開発サイトでも言及されていません。どこでその情報を入手しましたか?
1つのパラメーターのみを渡したいと言っていて、どちらでも問題がないように思われたので、リソースIDを渡して、その文字列名を見つけることができました。
String name = getResources().getResourceEntryName(id);
これは、両方の値を取得する最も効率的な方法かもしれません。長い文字列から "アイコン"の部分だけを探す必要はありません。
res / layout / my_image_layout.xml
<LinearLayout ...>
<ImageView
android:id="@+id/row_0_col_7"
...>
</ImageView>
</LinearLayout>
ImageViewを@ + id値で取得するには、Javaコード内で次のようにします。
String row = "0";
String column= "7";
String tileID = "row_" + (row) + "_col_" + (column);
ImageView image = (ImageView) activity.findViewById(activity.getResources()
.getIdentifier(tileID, "id", activity.getPackageName()));
/*Bottom code changes that ImageView to a different image. "blank" (R.mipmap.blank) is the name of an image I have in my drawable folder. */
image.setImageResource(R.mipmap.blank);
MonoDroid / Xamarin.Androidでできること:
var resourceId = Resources.GetIdentifier("icon", "drawable", PackageName);
ただし、GetIdentifierはAndroidでは推奨されないため、次のようにReflectionを使用できます。
var resourceId = (int)typeof(Resource.Drawable).GetField("icon").GetValue(null);
ここで、try / catchを配置するか、渡す文字列を確認することをお勧めします。
文字列リソース名からDrawable idを取得するために、私は次のコードを使用しています。
private int getResId(String resName) {
int defId = -1;
try {
Field f = R.drawable.class.getDeclaredField(resName);
Field def = R.drawable.class.getDeclaredField("transparent_flag");
defId = def.getInt(null);
return f.getInt(null);
} catch (NoSuchFieldException | IllegalAccessException e) {
return defId;
}
}