2015-11-02 69 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」,...

相關問題