Вчера мой оператор switch-case отлично работал. Но когда я запустил код ранее этим утром, затмение дало мне ошибку, подчеркнув операторы case красным цветом и сказав: выражения case должны быть постоянными выражениями, они постоянны, я не знаю, что произошло. Вот мой код ниже:
public void onClick(View src)
{
switch(src.getId()) {
case R.id.playbtn:
checkwificonnection();
break;
case R.id.stopbtn:
Log.d(TAG, "onClick: stopping srvice");
Playbutton.setImageResource(R.drawable.playbtn1);
Playbutton.setVisibility(0); //visible
Stopbutton.setVisibility(4); //invisible
stopService(new Intent(RakistaRadio.this,myservice.class));
clearstatusbar();
timer.cancel();
Title.setText(" ");
Artist.setText(" ");
break;
case R.id.btnmenu:
openOptionsMenu();
break;
}
}
Все R.id.int подчеркнуты красным.
java
android
switch-statement
HeartlessArchangel
источник
источник
R.id.playbtn
и т. Д.? Все ли статично и окончательно?R
обычно создается с помощью инструментов IDE / dev, поэтому он обычно подходит для используемой версии Android.Ответы:
В обычном Android-проекте константы в классе ресурса R объявляются следующим образом:
Однако, начиная с ADT 14, в проекте библиотеки они будут объявлены следующим образом:
Другими словами, в библиотечном проекте константы не являются окончательными. Поэтому ваш код больше не будет компилироваться.
Решение для этого простое: преобразуйте оператор switch в оператор if-else.
http://tools.android.com/tips/non-constant-fields
Вы можете быстро преобразовать
switch
оператор вif-else
оператор, используя следующее:В Eclipse
переместите курсор к
switch
ключевому слову и нажмите Ctrl+, 1затем выберитеВ Android Studio
переместите курсор к
switch
ключевому слову и нажмите Alt+, Enterзатем выберитеисточник
final
ключевого слова переменную можно изменить во время выполнения.У меня сработало снятие флажка «Библиотека» в свойствах проекта.
источник
Решение можно сделать так:
Пример:
Надеюсь, что это поможет вам.
источник
R.id. *, поскольку ADT 14 больше не объявляется как final static int, поэтому вы не можете использовать его в конструкции switch case. Вместо этого вы можете использовать предложение if else.
источник
Простое решение этой проблемы:
Щелкните переключатель, а затем нажмите CTL + 1, он изменит ваш переключатель на оператор блока if-else и решит вашу проблему.
источник
Как насчет другого решения сохранить красивый переключатель вместо if-else:
Итак, в вашем коде вы можете сделать это:
Перечисления статичны, поэтому это будет иметь очень ограниченное влияние. Единственное окно, вызывающее беспокойство, - это задействованный двойной поиск (сначала во внутреннем SparseArray, а затем в таблице переключателей)
Тем не менее, это перечисление также можно использовать для быстрой выборки элементов, если необходимо, сохраняя ссылку на идентификатор ... но это история для другого раза.
источник
Это вызывало у меня эту ошибку, когда я использовал переключатель в функции с переменными, объявленными в моем классе:
Проблема была решена, когда я объявил
final
переменным в начале класса:источник
enum
является лучшей альтернативойint
в этом случае. Вызывающий метод не сможет вызвать функцию с недопустимым типом.i have specific int types so its ok if i use ints
На самом деле это не имеет смысла. Что касается примера перечисления: docs.oracle.com/javase/tutorial/java/javaOO/enum.htmli mean that the incoming int variable type in the function will always be one of these 3 types so it won't break anything
Это ваше предположение. Кто-то другой может вызвать функцию некорректно с произвольным номером. Сenum
, вам не нужно предполагать, это обеспечивается языком.Я хотел бы упомянуть, что я столкнулся с такой же ситуацией, когда пытался добавить библиотеку в свой проект. Внезапно все операторы switch начали показывать ошибки!
Теперь я попытался удалить добавленную мной библиотеку, но даже тогда это не сработало. как бы то ни было " когда я чистил проект " все ошибки просто уходили!
источник