繁体   English   中英

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

[英]Android, get resource id by string?

有一个更好的方法吗:

    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 getDrawableIdByString("signal_" + mSignalStrength)函数替换switch语句。

正如评论中提到的那样,你可以使用

getIdentifier(String name, String defType, String defPackage)

对于你的情况,像这样

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

通过使用反射,您可以通过传递其名称来返回资源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):对drawables使用“drawable”,对字符串使用“string”,......

你这样做的方式是最可读和最健壮的方式。

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

它更容易阅读,因为您只需从代码中点击可绘制资源,并亲自查看哪些可绘制匹配哪种情况 - 当您以这种方式生成id时,这会变得有点困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM