我需要将资源ID传递给我的一个类中的方法。它需要使用引用所指向的id以及它还需要字符串。我应该如何最好地实现这一目标?
例如:
R.drawable.icon
我需要获取此的整数ID,但我还需要访问字符串“icon”。
如果我必须传递给方法的是“icon”字符串,那将是更好的。
答案 0 :(得分:148)
@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()
比使用反射更慢。 Check it out
答案 1 :(得分:69)
您可以使用此功能获取资源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;
}
}
所以,如果你想获得 drawable 这样的调用函数
getResourceId("myIcon", "drawable", getPackageName());
并且对于字符串,您可以像这样调用它
getResourceId("myAppName", "string", getPackageName());
答案 2 :(得分:36)
这是基于@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);
答案 3 :(得分:29)
如何从资源名称获取应用程序资源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);
}
}
可以修改该方法以访问其他类型的资源。
答案 4 :(得分:10)
如果你需要配对一个字符串和一个int,那么Map怎么样?
static Map<String, Integer> icons = new HashMap<String, Integer>();
static {
icons.add("icon1", R.drawable.icon);
icons.add("icon2", R.drawable.othericon);
icons.add("someicon", R.drawable.whatever);
}
答案 5 :(得分:9)
您可以使用Resources.getIdentifier()
,但在XML文件中使用时需要使用字符串格式,即package:drawable/icon
。
答案 6 :(得分:5)
我确实喜欢这个,它对我有用:
imageView.setImageResource(context.getResources().
getIdentifier("drawable/apple", null, context.getPackageName()));
答案 7 :(得分:4)
从字符串获取资源ID的简单方法。 这里 resourceName 是可绘制文件夹中资源ImageView的名称,它也包含在XML文件中。
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);
答案 8 :(得分:3)
既然你说你只想传递一个参数并且它似乎无关紧要,你可以传入资源标识符然后找出它的字符串名称,因此:
String name = getResources().getResourceEntryName(id);
这可能是获得这两个值的最有效方式。你不必在较长的字符串中找到“icon”部分。
答案 9 :(得分:2)
public int getDrawableName(Context ctx,String str){
return ctx.getResources().getIdentifier(str,"drawable",ctx.getPackageName());
}
答案 10 :(得分:1)
在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或验证你传递的字符串。
答案 11 :(得分:1)
科特林方法
inline fun <reified T: Class<R.drawable>> T.getId(resourceName: String): Int {
return try {
val idField = getDeclaredField (resourceName)
idField.getInt(idField)
} catch (e:Exception) {
e.printStackTrace()
-1
}
}
用法:
val resId = R.drawable::class.java.getId("icon")
答案 12 :(得分:0)
为了从String资源名称中获取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;
}
}
答案 13 :(得分:0)
在你的res / layout / my_image_layout.xml
中<LinearLayout ...>
<ImageView
android:id="@+id/row_0_col_7"
...>
</ImageView>
</LinearLayout>
要通过其@ + id值获取ImageView,请在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);