2013-12-18 3 views
2

Есть ли способ сделать следующий скрипт более эффективным? Я хочу, чтобы этот код был легко обслуживаемым, вот почему я хотел бы избавиться от if else if. Надеюсь, вы, ребята, можете мне помочь. В нижней части это то, что я хотел бы видеть, если это возможно, что, конечно.используйте строку для R.color. "String"

 if (category.equals("infusion")){ 
     layout.setBackgroundResource(R.color.infusion); 
      title.setText(R.string.title_infusion);    
    } else if (category.equals("pills")){ 
      layout.setBackgroundResource(R.color.pills); 
      title.setText(R.string.title_pills); 
    } else if (category.equals("pumps")){ 
      layout.setBackgroundResource(R.color.pumps); 
      title.setText(R.string.title_pumps); 
    } else if (category.equals("oxygen")){ 
      layout.setBackgroundResource(R.color.oxygen); 
      title.setText(R.string.title_oxygen); 
    } else if (category.equals("scores")){ 
      layout.setBackgroundResource(R.color.scores); 
      title.setText(R.string.title_scores); 
    } else if (category.equals("converters")){ 
      layout.setBackgroundResource(R.color.converters); 
      title.setText(R.string.title_converters); 
    } 

Что-то вроде этого?

layout.setBackgroundResource(R.color.*category*); 
title.setText(R.string.title_*category*); 

ответ

3

Я уверен, что все то, что вы делаете «упрощать» это будет означать отражение, и, вероятно, в конечном итоге делает ваш код медленнее и труднее понять. То, что у вас есть, - это совершенно правильный способ сделать это, очень понятно читателю и не содержит каких-либо странных методов.

I.E. Это работает, зачем это исправлять?

Ok, Edit:

При запуске можно сопоставить значение строки ресурсов идентификаторов с помощью хэш-карты.

Что-то вроде:

HashMap map = new HashMap(); 
map.put("infusion",R.id.infusion); 

, а затем позже:

layout.setBackgroundResource(map.get(category)); 
title.setText(category); 

Это мощь работы, но опять же это на самом деле не улучшение имо.

+2

, если он не нарушил – JoeC

2

Заканчивать Resources.getIndentifier() может иметь вспомогательную функцию, как:

public static int resourceNameToId(Context context, String name, String resType) { 
    if (name != null && name.length() > 0) { 
     return context.getResources().getIdentifier(name, resType, context.getPackageName()); 
    } 

    return 0; 
} 

Затем, чтобы использовать его:

layout.setBackgroundResource(resourceNameToId(getContext(), category, "color")); 
+0

Я должен также сказать, что это использует отражение внутренне и следует использовать слегка – FunkTheMonk

+0

Из документов: Примечание: использование этой функции не рекомендуется. Гораздо эффективнее извлекать ресурсы по идентификатору, чем по имени. –

+0

Yup, я бы не предложил вставить адаптер, но он может быть очень полезен для динамически созданного контента. Кроме того, по эффективному, я думаю, что OP больше интересуется ремонтопригодностью. – FunkTheMonk

0

Вы не можете достичь этого с помощью построения кода.

использовать что-то вроде:

layout.setBackgroundResource(getColorByCategory(category)); 
title.setText(getCategoryTitle(category)); 

где getColorByCategory() и getCategoryTitle() ваши собственные функции.

0

Есть два способа, которые я могу придумать с головы. Хэш-карта и/или объект Ресурсы.

А имеет карта будет включать немного настройки, например так:

private static final Map<String, Integer> COLOURS = new HashMap<String, Integer>(); 

static { 
    COLOURS.put("pills", R.color.red); 
    COLOURS.put("pumps", R.color.green); 
} 

Тогда это очень легко установить цвета позже:

layout.setBackgroundColor(COLOURS.get(category)); 

Вы можете обнулить проверить цвета приходят вне карты, прежде чем устанавливать их, если данные, которые у вас есть, не гарантируются.

В качестве альтернативы вы можете использовать объект «Ресурсы», например.

Resources resources = context.getResources(); 
resources.getColor(resources.get("colour_" + category, "color", context.getPackageName())); 
2

Вы можете использовать перечисление, как это, что держать ваши ценности и цвета:

public enum ColorValue { 

InFusion(android.R.color.black), 
Pills(android.R.color.white); 

int color; 

ColorValue(int Value) { 
    color = Value; 
} 

public int getColorResource() { 
    return color; 
} 

} 

Затем доступ к значению перечисления, подобное этому

ColorValue x=ColorValue.InFusion; 
x.getColorResource(); 
0

Вы можете использовать перечисление сделать это более эффективно:

(В вашем классе) объявить

public enum Category { 
    infusion (R.color.infusion, R.string.title_infusion, "infusion"), 
    pills (R.color.pills, R.string.title_pills, "pills") //, 
    //etc... comma-seperated values. Those are handled like any other enum 
    ; 
    public final int relatedBackground; 
    public final String relatedTitle; 
    public final String identifier; //To keep the identifiers you used previously 

    private Category (int back, String title, String id) { 
     this.relatedBackground = back; 
     this.relatedTitle = title; 
     this.identifier = id; 
    } 
} 

И ваш метод будет выглядеть следующим образом:

public void foo(Category cat) { //You pass in your enum type 
    //Do what you want 
    if(cat != null) { //Avoid NullPointerException if necessary 
     layout.setBackgroundResource(cat.relatedBackground); 
     title.setText(cat.relatedTitle); 
    } 
} 

Этот метод является отличным способом, чтобы решить проблему, которую вы получили, потому что вы можете поддерживать вы проецировать на добавив новое значение к список, разделенный запятыми. Вам также не нужно беспокоиться о том, что нужно искать значения каждый раз из какой-либо таблицы.

Недостатком является то, что трудно/невозможно настроить перечисление во время выполнения. Поскольку все переменные в перечислении должно быть окончательными, как enumtype сам не модифицируемые вы не можете сделать что-то вроде

cat.relatedbackground = someValue; // Can't do that: all fields are final 

Если вы хотите сделать, что вы должны использовать Экстерн таблицу. Кроме того, это отличное решение.

 Смежные вопросы

  • Нет связанных вопросов^_^