Может ли оператор переключения в Java принимать «представление» в качестве аргумента? - PullRequest
0 голосов
/ 19 мая 2018

Я хочу, чтобы оператор switch принял View в качестве аргумента.Я знаю, что вид в основном виджет на макете.Но это не работает, когда я рассматриваю аргумент.Он показывает ошибку в случае зеленого цвета как «требуется постоянное выражение»

public void onClick(View v) {
   switch(v) {
      case green:
          CL.setBackgroundColor(Color.parseColor("#00ff00"));
          break;
      case R.id.button:
          CL.setBackgroundColor(Color.BLUE);
          break;
   }
}

Это прекрасно работает, когда я принимаю switch (v.getId ()) в качестве параметра:

public void onClick(View v) {
        switch(v.getId()) {
            case R.id.button2:
                CL.setBackgroundColor(Color.parseColor("#00ff00"));
                break;
            case R.id.button:
                CL.setBackgroundColor(Color.BLUE);
                break;
        }
 }

Есть ли способчтобы рассматривать в качестве параметра?Я уже назначил вид в более раннем коде

Button blue= (Button)findViewById(R.id.button);
Button green=findViewById(R.id.button2);

1 Ответ

0 голосов
/ 19 мая 2018

Переменная в switch не может быть ничем иным, кроме как примитивом, его оболочкой, перечислением или строкой.

Согласно Спецификация языка Java :

Тип выражения должен быть типом char, byte, short, int, Character, Byte, Short, Integer, String или enum (§8.9), иначе произойдет ошибка времени компиляции.

Что касается вашего вопроса:

Есть ли способ получить представление в качестве параметра?

Нет, не как таковой.Однако вы можете создать тип Enum для каждого вида, который должен быть включен.Обычно вы можете расширить класс View или просто указать ему поле enum.Однако, поскольку это, по-видимому, объект библиотеки, который вы не можете контролировать, я бы сопоставил идентификаторы представлений со значениями перечисления следующим образом:

    switch(v.getId()) {
        case Foo.BAR1:
            // doStuff
            break;
        case Foo.BAR2:
           // doOtherStuff
           break;
        default:
    }

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

...