Java Android,通过字符串获取资源id?

Java Android,通过字符串获取资源id?,java,android,android-resources,Java,Android,Android Resources,有没有更好的方法来做到这一点: int drawable; switch(mSignalStrength) { case 0: drawable = R.drawable.signal_0; break; case 1: drawable = R.drawable.signal_1; break; case 2:

有没有更好的方法来做到这一点:

    int drawable;
    switch(mSignalStrength) {
        case 0:
            drawable = R.drawable.signal_0;
            break;
        case 1:
            drawable = R.drawable.signal_1;
            break;
        case 2:
            drawable = R.drawable.signal_2;
            break;
        case 3:
            drawable = R.drawable.signal_3;
            break;
        case 4:
            drawable = R.drawable.signal_4;
            break;
        case 5:
            drawable = R.drawable.signal_5;
            break;
        default:
            drawable = -1;
    }

我试图用一些
int-getDrawableIDystring(“signal”+mSignalStrength)
函数替换switch语句。

如评论中所述,您可以使用

getIdentifier(字符串名称、字符串定义类型、字符串定义包)

对你来说,就像这样

int resId = getResources().getIdentifier("signal_" + mSignalStrength, "drawable", getPackageName());

您这样做的方式是最具可读性和健壮性的方式

它允许您稍后添加/删除项目,并且不会将您绑定到特定的命名约定


它更容易阅读,因为您只需从代码中点击可绘制资源,就可以自己查看哪一个可绘制资源与哪一种情况匹配——当您以这种方式生成id时,这会变得更难。

通过使用反射,您可以通过传递其名称来返回资源id。
当我需要这样的东西时,我会用这个:

1-将此方法添加到代码中:

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;
    }
}
2-像这样使用它:

int myID =
    getResourceID("your_resource_name", "drawable", getApplicationContext());
注(1):无路径(如果是图像,则无扩展)。

注意(2):使用“drawable”表示可绘制,使用“string”表示字符串,…

使用反射有什么问题:
getIdentifier()
。您可以通过传递资源id的名称来返回它。@warlock我已经将相同的代码重复了6次,用于不同的信号强度值。这太难看了。@chrisdew,这只是一个开关案例,它将代表mSignalStrength中提供的值运行,在这种情况下,您应该发布完整的问题,您试图实现的目标,以及how@warlock谢谢,我已经修正了这个问题。