2015-11-02 83 views
2

是否有更好的方法来做到这一点:Android,通过字符串获取资源ID?

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语句。

+0

问题在于 – warlock

+4

使用反射:'getIdentifier()'。您可以通过传递其名称来返回资源ID。 –

+0

@warlock我得到了相同的代码重复了6次,为不同的信号强度值。这很丑陋。 – fadedbee

回答

2

正如有人在评论中提到的,你可以使用

getIdentifier(String name, String defType, String defPackage)

对于你的情况下,这样的

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

的方式你这样做是最可读和强大办法。

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

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

2

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

相关问题