我需要将资源ID传递给我的一个类中的方法。它既需要使用引用指向的id,也需要使用字符串。我应该如何最好地做到这一点?
例如:
R.drawable.icon
我需要获取它的整数ID,但是我还需要访问字符串“ icon”。
如果我只需要传递给该方法的是“ icon”字符串,那将是更好的选择。
我需要将资源ID传递给我的一个类中的方法。它既需要使用引用指向的id,也需要使用字符串。我应该如何最好地做到这一点?
例如:
R.drawable.icon
我需要获取它的整数ID,但是我还需要访问字符串“ icon”。
如果我只需要传递给该方法的是“ icon”字符串,那将是更好的选择。
Answers:
@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()
必须进行两次反射查找。在上面的示例中,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); }
我确实喜欢这样,它为我工作:
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是可绘制文件夹中资源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);
getIdentifier
必须为id
。android开发站点中甚至都没有提到。您从哪里获得这些信息?
在您的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);
为了从字符串资源名称获取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;
}
}