如何将字符串转换为可绘制对象(Drawable)?

12

我在drawable文件夹中有许多图标,并将它们的名称作为字符串保存。如何在动态生成的情况下,使用这些名称访问drawable文件夹并更改imageView(或任何视图)的背景?谢谢。

6个回答

35

这可以使用反射来完成:

String name = "your_drawable";
final Field field = R.drawable.getField(name);
int id = field.getInt(null);
Drawable drawable = getResources().getDrawable(id);

或者使用Resources.getIdentifier()

String name = "your_drawable";
int id = getResources().getIdentifier(name, "drawable", getPackageName());
Drawable drawable = getResources().getDrawable(id);

然后在任一情况下使用此内容来设置可绘制对象:

view.setBackground(drawable)

我应该使用 view.setBackground(drawable) 还是 view.setBackgroundResource(id) 或者其他什么方法? - Utku Soytaş
非常感谢,这个可以工作 :) 所有答案都是正确的。 - Utku Soytaş
很高兴能够帮助。我点赞了大部分其他答案来弥补采纳的不足。 - FD_
谢谢 :) 我不能做这个,因为我的声誉不够好 :) - Utku Soytaş
1
这对我没有用,但我在这里找到了解决方案:https://dev59.com/82Yr5IYBdhLWcg3w29lI - Michal
显示剩余4条评论

7
int resId = getResources().getIdentifier("your_drawable_name","drawable",YourActivity.this.getPackageName());
Drawable d = YourActivity.this.getResources().getDrawable(resId);

5

可以这样做:

ImageView imageView = new ImageView(this);
imageView.setBackground(getResources().getDrawable(getResources().getIdentifier("name","id",getPackageName())));

3

试试这个:

public Bitmap getPic (int number)
{
    return
        BitmapFactory.decodeResource
        (
            getResources(), getResourceID("myImage_" + number, "drawable", getApplicationContext())
        );
}

protected final static int getResourceID
(final String resName, final String resType, final Context ctx)
{
    final int ResourceID =
        ctx.getResources().getIdentifier(resName, resType,
            ctx.getApplicationInfo().packageName);
    if (ResourceID == 0)
    {
        throw new IllegalArgumentException
        (
            "No resource string found with name " + resName
        );
    }
    else
    {
        return ResourceID;
    }
}

谢谢。我相信这是真的,但我没有尝试过 :) - Utku Soytaş

1
如果你有文件名作为字符串,你可以使用以下代码:
int id = getResources().getIdentifier("name_of_resource", "id", getPackageName());

使用此ID,您可以像以前一样访问它(假设它是可绘制的):

Drawable drawable = getResources().getDrawable(id);

0

使用案例如果不在任何活动中,可以使用@FD_的示例

注意:

如果您不在任何活动中,则必须发送上下文参数才能使用“getResources()”或“getPackageName()”,而“getDrawable(id)”已过时,请改用getDrawer(int id, Theme theme)(主题可以为null)。

String name = "your_drawable";
int id = context.getResources().getIdentifier(name, "drawable", 
context.getPackageName());
Drawable drawable = context.getResources().getDrawable(id, null);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接