Что вызывает ошибки "постоянного выражения" для генерируемых значений 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.