2014-10-27 2 views
1

У меня есть ListView, который содержит много TextViews, а один TextView должен содержать другой цвет фона в зависимости от извлекаемых данных.Извлечь цвет программно из R.color

Поскольку я не хочу жестко кодировать цвета, я использовал R.color для установки моих цветов. Это работает хорошо, но я должен проверять вручную для каждого цвета, потому что я замечаю, что могу получить цвета, такие как HashMap. Так что мой первый Try был такой:

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

Хороший вопрос с достаточным количеством деталей! –

+0

BTW, название цвета находится последовательно, не так ли? –

+0

@PareshMayani Точно. Спасибо :) – rootingbill

ответ

1

Вы можете получить цвет ID, используя имя ресурса (R.color.foo) и решить ее во время выполнения:

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' - это будет компилировать в порядке :) –

+0

Я был формально« Integer », но я изменил его перед публикацией. –

+0

Ошибки в этом коде. int color = null; не будет работать. Также color = getColorValueByResourceName ("R.color.foo21"); неправильно. это должно быть color = getColorValueByResourceName ("foo21"); – Rohit5k2

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; 
} 
Смежные вопросы