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

Ham*_*mid 147 java resources android android-resources

我需要将资源ID传递给我的一个类中的方法.它需要使用引用所指向的id以及它还需要字符串.我该怎样才能做到最好?

例如:

R.drawable.icon
Run Code Online (Sandbox Code Playgroud)

我需要获取此的整数ID,但我还需要访问字符串"icon".

如果我必须传递给方法的是"icon"字符串,那将是更好的选择.

Mac*_*rse 157

@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;
    } 
}
Run Code Online (Sandbox Code Playgroud)

它将用于获取R.drawable.icon资源整数值的值

int resID = getResId("icon", R.drawable.class); // or other resource class
Run Code Online (Sandbox Code Playgroud)

我刚发现一篇博文说,这Resources.getIdentifier()比使用反射一样慢.看看吧.

  • 调用应该是getId("icon",R.drawable.class); 不是getResId("icon",context,Drawable.class); (14认同)
  • 为什么`context`参数? (9认同)
  • @Macarse:现在,`getIdentifier()`必须进行两次反射查找.在上面的例子中,`getIdentifier()`将使用反射来获取`Drawable.class`,然后使用另一个反射查找来获取资源ID.这将解释速度差异.话虽如此,它们都不是特别快,因此确实需要缓存(特别是如果在循环中使用,或者用于`ListView`中的行).而反思方法的一个大问题是它对Android的内部结构做出了假设,可能会在未来的某个版本中发生变化. (8认同)
  • 我会使用带有ID的整数数组.对ID使用字符串听起来不是正确的方法. (3认同)

Azh*_*har 73

您可以使用此功能获取资源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;
    } 
}
Run Code Online (Sandbox Code Playgroud)

所以,如果你想获得这样的可绘制调用函数

getResourceId("myIcon", "drawable", getPackageName());
Run Code Online (Sandbox Code Playgroud)

对于字符串,你可以像这样调用它

getResourceId("myAppName", "string", getPackageName());
Run Code Online (Sandbox Code Playgroud)

读这个

  • 制作一个简单地调用另一个并"处理"可能的异常的函数有什么意义呢?直接调用getResources().getIdentifier(). (8认同)
  • 为了它的工作我不得不删除'静态' (2认同)

Dan*_*eón 37

这是基于@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

例:

getId("icon", R.drawable.class);
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的代码.不是上面的马车! (7认同)

小智 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*ego 11

如果你需要配对一个字符串和一个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);
}
Run Code Online (Sandbox Code Playgroud)


Ebo*_*ike 9

你可以使用Resources.getIdentifier(),虽然你需要在XML文件中使用它时使用字符串的格式,即package:drawable/icon.


Ste*_*ing 7

既然你说你只想传递一个参数,而且似乎无关紧要,你可以传入资源标识符,然后找出它的字符串名称,因此:

String name = getResources().getResourceEntryName(id);
Run Code Online (Sandbox Code Playgroud)

这可能是获得这两个值的最有效方法。您不必从较长的字符串中只找到“图标”部分。


小智 6

从字符串中获取资源 ID 的简单方法。这里的resourceName是 drawable 文件夹中资源 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);
Run Code Online (Sandbox Code Playgroud)


Ars*_*ius 6

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
            }
        }
Run Code Online (Sandbox Code Playgroud)

用法:

val resId = R.drawable::class.java.getId("icon")
Run Code Online (Sandbox Code Playgroud)

或者:

val resId = R.id::class.java.getId("viewId")
Run Code Online (Sandbox Code Playgroud)


Sar*_*oev 5

我喜欢这个,它对我有用:

    imageView.setImageResource(context.getResources().
         getIdentifier("drawable/apple", null, context.getPackageName()));
Run Code Online (Sandbox Code Playgroud)


Iva*_*ovk 5

Simple method to get resource ID:

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

  • 如果您只是为您的答案提供更多信息会更好。 (2认同)