2014-10-27 169 views
1

我有一個包含許多TextView的ListView,根據檢索到的數據,一個TextView應該包含不同的背景顏色。以R.編程方式檢索顏色

因爲我不想硬編碼我使用R.color來設置我的顏色的顏色。這很好,但我必須手動檢查每種顏色,因爲我注意到能夠像HashMap那樣獲取顏色。所以我的第一次嘗試是這樣的:

switch(line) { 
    case "1": 
     lineColor = context.getResources().getColor(R.color.line1); 
    case "2": 
     lineColor = context.getResources().getColor(R.color.line2); 
    .... 
    .... 
    } 

這似乎遠離乾淨的代碼,所以我嘗試使用字符串數組不同的方法:

<string-array name="line_color_names"> 
    <item>1</item> 
    <item>2</item> 
    .... 
</string-array> 

<string-array name="line_color_values"> 
    <item>#e00023</item> 
    <item>#ef9ec1</item> 
    .... 
</string-array> 

在我AdapterClass我剛剛創建了一個HashMap和把這個字符串數組一起:

String[] line_color_names = context.getResources().getStringArray(
      R.array.line_color_names); 
    String[] line_color_values = context.getResources().getStringArray(
      R.array.line_color_values); 

    lineColors = new HashMap<String, String>(); 
    for (int i = 0; i < line_color_names.length; i++) { 
     lineColors.put(line_color_names[i], line_color_values[i]); 
    } 

所以我的問題是:這是實現這一目標的唯一途徑或有另一種,最好通過直接從R.color服用顏色?

在此先感謝!

+0

有足夠的細節問題問得好! – 2014-10-27 09:58:44

+0

順便說一下,顏色名稱是按順序排列的,對嗎? – 2014-10-27 09:59:39

+0

@PareshMayani準確無誤。謝謝:) – rootingbill 2014-10-28 09:07:53

回答

1

您可以通過使用資源名稱(R.color.foo)獲得色彩ID,並在運行時解決它:

public int getColorIdByResourceName(String name) { 
    int color; 
    try { 
    Class res = R.color.class; 
    Field field = res.getField(name); 
    int color = field.getInt(null); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
    return color; 
} 

然後

int colorId = getColorIdByResourceName("foo21"); 
int colorVal = getResources().getColor(getColorIdByResourceName("foo21")); 
+0

'int color = null' - 那會編譯好:) – 2014-10-27 10:11:22

+0

我原來是'Integer',但是我在發佈前改了它。 – 2014-10-27 10:11:59

+0

此代碼中的錯誤。 int color = null;將無法工作。 color = getColorValueByResourceName(「R.color.foo21」);是錯的。它應該是color = getColorValueByResourceName(「foo21」); – Rohit5k2 2014-10-27 10:12:21

0

你的第二個解決方案看起來不錯,並不完全是黑客。你應該找到這個。 但是,如果你動態地獲得你的顏色名稱,那麼這個代碼可能對你很方便。

public static int getColorIDFromName(String name) 
{ 
    int colorID = 0; 

    if(name == null 
      || name.equalsIgnoreCase("") 
      || name.equalsIgnoreCase("null")) 
    { 
     return 0; 
    } 

    try 
    { 
     @SuppressWarnings("rawtypes") 
     Class res = R.color.class; 
     Field field = res.getField(name); 
     colorID = field.getInt(null); 
    } 
    catch(Exception e) 
    { 
     Log.e("getColorIDFromName", "Failed to get color id." + e); 
    } 

    return colorID; 
} 
相關問題