java - studio - ¿Qué causa los errores de "expresión constante requerida" para los valores R.id.xxx generados en las declaraciones de cambio?
udacity android advanced (3)
Cuando desarrolle una biblioteca , debe tener en cuenta que la instrucción de switch
requiere que todas las etiquetas de casos, como R.id.XXX, sean constantes en el momento de la compilación (de modo que los valores puedan copiarse directamente en los archivos .class). Si su proyecto es una biblioteca, la clase R
será declarada como no final
.
La solución para esto es simple: convierta la instrucción switch en una instrucción if-else
. En realidad Android Studio te da un consejo)
Lea más aquí: http://tools.android.com/tips/non-constant-fields
Tenemos una aplicación multiproyecto que nos estamos moviendo a Gradle. Los resultados de compilación en errores de compilación de Java como:
AFragment.java:159: constant expression required
case R.id.aBtn:
Hemos confirmado que las constantes reportadas en los errores están en el R.java
generado.
Una pista es que los errores son solo para valores de switch. Por ejemplo, no hay ningún error al usar findViewById(R.id.aBtn)
.
También tenga en cuenta que las constantes son del proyecto principal, no uno de los proyectos de la biblioteca.
para cualquiera que busque deshacerse de los errores, la sugerencia de laalto lo resolverá.
El enlace que proporcionó, junto con el hecho de que Eclipse no muestra los errores que se producen al construir con Gradle, me dio otra pista. el R.java generado por eclipse define las constantes principales del proyecto como "final", pero los valores generados por gradle no son "finales". La solución real debe estar en la corrección de los archivos de compilación de Gradle.
SOLUCIÓN (2014-01-09)
nuestro build.gradle para la aplicación estaba aplicando el complemento de la biblioteca de Android en lugar del complemento de Android. fue este:
aplicar plugin: ''android-library''
cambiándolo a esto:
aplicar plugin: ''android''
arreglado el problema
Esto sucede si utiliza los recursos de un proyecto de biblioteca . En ese caso, los identificadores de la clase R
no son realmente constantes y, por lo tanto, no se pueden usar en una instrucción de cambio.
Los identificadores de recursos del proyecto de la biblioteca no son static int
.
Convierta el código que necesita para activar los ID de recursos de la biblioteca a estructuras if
- else
.
Lectura adicional: http://tools.android.com/tips/non-constant-fields