Что вызывает ошибки "постоянного выражения" для генерируемых значений R.id.xxx в операторах switch?
У нас есть многопроектное приложение, которое мы переходим на gradle. В результате сборки возникают ошибки компиляции Java, например:
AFragment.java:159: constant expression required
case R.id.aBtn:
Мы подтвердили, что константы, сообщаемые в ошибках, находятся в сгенерированном R.java
.
Один ключ заключается в том, что ошибки относятся только к значениям переключателя. Например, нет ошибки при использовании findViewById(R.id.aBtn)
.
также отметим, что константы взяты из основного проекта, а не из одного из проектов библиотеки.
для тех, кто хочет избавиться от ошибок, предложение laalto решит его.
ссылка, которую он предоставил, а также тот факт, что затмение не показывает ошибки, возникающие при построении с помощью gradle, дало мне еще один ключ. R.java, сгенерированный eclipse, определяет основные константы проекта как "final", но сгенерированные значения gradle не являются "final". реальное решение должно заключаться в исправлении файлов сборки gradle.
РЕШЕНИЕ (2014-01-09)
наш build.gradle для приложения применял плагин android-library вместо плагина android. это было так:
применить плагин: 'android-library'
изменив его на это:
применить плагин: 'android'
исправлена проблема.
Ответы
Ответ 1
Идентификаторы ресурса ресурса библиотеки не являются константами static final int
s, просто static int
s.
Преобразовать код, который должен включать идентификаторы ресурсов библиотеки в структуры if
- else
.
Дополнительная литература: http://tools.android.com/tips/non-constant-fields
Ответ 2
Это происходит, если вы используете ресурсы из проекта Библиотеки. В этом случае идентификаторы в классе R
не являются действительно константами и поэтому не могут использоваться в инструкции switch.