Android,从字符串获取资源 ID?

我需要将一个资源 ID 传递给我的一个类中的一个方法。它既需要使用引用指向的 id,也需要使用字符串。我应该如何最好地实现这一点?

例如:

R.drawable.icon

我需要得到这个的整数 ID,但是我也需要访问字符串“ icon”。

如果我必须传递给该方法的全部内容是“ icon”字符串,那会更好。

185198 次浏览

您可以使用 Resources.getIdentifier(),尽管在 XML 文件中使用字符串时需要使用它的格式,即 package:drawable/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()是慢于使用反射像我一样。

如果需要将字符串和整型匹配,那么使用 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);
}

如何从资源名称中获取 申请资源 ID 是一个非常常见并且得到很好回答的问题。

如何从资源名称中获取 本地机器人资源 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);
}
}

可以修改该方法以访问其他类型的资源。

这是基于@Macass 的回答。

使用此选项可以更快速、更友好地获取资源 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);

我喜欢这样,它是为我工作:

    imageView.setImageResource(context.getResources().
getIdentifier("drawable/apple", null, context.getPackageName()));

可以使用此函数获取资源 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());

看看这个

因为您说您只想传递一个参数,而且似乎传递哪个参数并不重要,所以您可以将资源标识符传递进来,然后找到它的字符串名称,因此:

String name = getResources().getResourceEntryName(id);

这可能是获取这两个值的最有效方法。您不必费尽心思从一个较长的字符串中寻找“图标”部分。

从字符串获取资源 ID 的简单方法。 这里的 Resource 名称是资源 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);

在 MonoDroid/Xamarin 中,你可以使用 Android:

 var resourceId = Resources.GetIdentifier("icon", "drawable", PackageName);

但是由于 GetIdentifier 并不推荐在 Android 中使用——你可以这样使用反射:

 var resourceId = (int)typeof(Resource.Drawable).GetField("icon").GetValue(null);

我建议在其中放置 try/catch 或验证所传递的字符串。

为了从 String 资源名称中获取可绘制的 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;
}
}
Simple method to get resource ID:


public int getDrawableName(Context ctx,String str){
return ctx.getResources().getIdentifier(str,"drawable",ctx.getPackageName());
}

在 res/layp/my _ image _ lay.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);

Kotlin 的方法

inline fun <reified T: Class<*>> 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")

或者:

val resId = R.id::class.java.getId("viewId")