Android: как я могу использовать значения res / inteers.xml в переключателе? - PullRequest
3 голосов
/ 20 апреля 2011

В моем приложении мне просто нужны глобальные значения с хорошими именами.Во-первых, я поместил их как компоненты «public static final» в отдельный класс.

Затем я понял, что то, что я делал с глобальными строками (помещая их в res / strings.xml и используя их через getString (R.string.string_name)), также должно работать с целыми числами.

Однако я впервые обнаружил, что нет такой вещи, как getInteger (R.integer.integer_name), а есть только довольно длинный путь:

Resources r = getResources();
int integer = getInteger(R.integer.integer_name);

Во-вторых, когда я пытаюсь использовать значения в переключателе/ case expression Я получаю только сообщение "case выражения должны быть константными выражениями".

Так какой смысл вообще использовать res / Integers.xml?Я просто собираюсь вернуть свои целые числа в какой-то бесполезный класс ...

С уважением, медуза

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

Для выражений switch / case нам всегда нужны константы или перечисления (<- ENUMS !!) в операторах case. Переменные допускаются для параметра <code>switch, но параметры case никогда не должны изменяться.

Так что, если вам нужно "сохранить" параметры регистра и подобные им имена, отбросьте integers.xml (не решает вашу проблему), а также static final public int - внедрите enum вместо того, чтобы смоделировать ваш глобальный значения.


Просто дождался некоторых деталей, чтобы предложить решение enum;) Вот и мы:

public enum Value{ VALUE_ONE(300), VALUE_TWO(501), UNKNOWN(-1);
   private int value;
   private Value(int value) {this.value = value;}

   public int getValue() {
     return value;
   }

   public Value findValue(int value) {
     for (Value v:values()) {
       if (v.value == value)
          return v;
     }
     return Value.UNKNOWN;
}

findValue может использоваться для получения перечисления для числового значения, UNKNOWN является альтернативой возвращению null, если мы ищем неизвестное число. Веселитесь:)

0 голосов
/ 04 апреля 2013

Что на самом деле было сделано, так это создать набор значений либо в strings.xml, либо в других пользовательских XML-файлах и дать им описательные имена. Эти значения становятся статичными во время компиляции, каждое значение XML делает, и тогда я могу просто ссылаться на них по их идентификаторам.

Итак, в XML я делаю:

<string name="descriptive_name_that_is_easily_read_in_switch_case">
                     What I put here really doesn't matter</string>

Затем в выключателе / ​​корпусе

switch(someValue){
    case R.id.descriptive_name_that_is_easily_read_in_switch_case:{
      <code>
    }
    break;
}

Прелесть этого в том, что я могу удалить enum / static инициализацию из кода, сделать его более читабельным и по-прежнему повторно использовать значения во всей программе.

Конечно, бывают случаи, когда вы хотите, чтобы ваши перечисления / статические значения были видны только в определенном классе или методе. Тогда это не то, что вы бы сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...