Mi declaración de cambio de caso funciona perfectamente bien ayer. Pero cuando ejecuté el código más temprano esta mañana, eclipse me dio un error subrayando las declaraciones de casos en color rojo y dice: las expresiones de casos deben ser expresiones constantes, es constante, no sé lo que sucedió. Aquí está mi código a continuación:
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;
}
}
Todos los R.id.int están subrayados en rojo.
java
android
switch-statement
Arcángel sin corazón
fuente
fuente
R.id.playbtn
etc.? ¿Es todo estático y final?R
generalmente es generada por las herramientas IDE / dev, por lo que generalmente es correcta para la versión de Android en uso.Respuestas:
En un proyecto normal de Android, las constantes en la clase de recursos R se declaran así:
Sin embargo, a partir de ADT 14, en un proyecto de biblioteca, se declararán así:
En otras palabras, las constantes no son finales en un proyecto de biblioteca. Por lo tanto, su código ya no se compilará.
La solución para esto es simple: convertir la instrucción switch en una instrucción if-else.
http://tools.android.com/tips/non-constant-fields
Puede convertir rápidamente una
switch
declaración en unaif-else
declaración utilizando lo siguiente:En Eclipse
Mueva su cursor a la
switch
palabra clave y presione Ctrl+ 1luego seleccioneEn Android Studio,
mueva el cursor a la
switch
palabra clave y presione Alt+ y Enterluego seleccionefuente
final
palabra clave, una variable se puede cambiar en tiempo de ejecución.Desmarcar "Es la biblioteca" en el proyecto Propiedades funcionó para mí.
fuente
La solución se puede hacer de esta manera:
Ejemplo:
Espero que esto te ayudará.
fuente
R.id. *, ya que ADT 14 ya no se declara como int estático final, por lo que no puede usarlo en la construcción de mayúsculas y minúsculas. Puede usar la cláusula if else en su lugar.
fuente
La solución simple para este problema es:
Haga clic en el interruptor y luego presione CTL + 1, cambiará su cambio a la instrucción de bloqueo if-else, y resolverá su problema
fuente
¿Qué tal esta otra solución para mantener el buen interruptor en lugar de un if-else:
Entonces, en su código, puede hacer esto:
Las enumeraciones son estáticas, por lo que esto tendrá un impacto muy limitado. La única ventana de preocupación sería la doble búsqueda involucrada (primero en el SparseArray interno y luego en la tabla de interruptores)
Dicho esto, esta enumeración también se puede utilizar para buscar los elementos de manera fluida, si es necesario manteniendo una referencia a la identificación ... pero esa es una historia para otro momento.
fuente
Me estaba arrojando este error cuando uso switch en una función con variables declaradas en mi clase:
El problema se resolvió cuando declaró
final
a las variables al comienzo de la clase:fuente
enum
Es una alternativa mejor aint
en este caso. La persona que llama del método no podrá llamar a la función con un tipo no válido.i have specific int types so its ok if i use ints
Realmente no tiene sentido. Con respecto al ejemplo de enum: 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
Esta es tu suposición. Alguien más puede llamar a la función incorrectamente con un número arbitrario. Conenum
, no es necesario suponer, se aplica por el idioma.Me gustaría mencionar que me encontré con la misma situación cuando intenté agregar una biblioteca a mi proyecto. ¡De repente, todas las declaraciones de cambio comenzaron a mostrar errores!
Ahora intenté eliminar la biblioteca que agregué, incluso entonces no funcionó. sin embargo, " cuando limpié el proyecto ", ¡todos los errores se salieron!
fuente