commutateur cas d'erreur: le cas des expressions doit être l'expression constante
Mon instruction de cas switch fonctionne parfaitement bien hier. Mais lorsque j'exécute le code, ce matin, eclipse m'a donné une erreur en soulignant le cas des déclarations de couleur rouge et dit: cas des expressions doit être constante, elle est constante, je ne sais pas ce qui s'est passé. Voici mon code ci-dessous:
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;
}
}
Tous les R. id.int sont tous soulignés en rouge.
- Pouvez-vous donner la définition de
R.id.playbtn
etc.? Tout est statique et définitive? - Probablement vous avez supprimé/modifié votre mise en page et les codes n'existent plus, ou quelque chose comme ça...
- La classe
R
est généralement généré par l'IDE/outils de dev, donc il est généralement correcte pour la version d'Android utilisée. - mon R. id.* sont tous beaux et exister dans la gen classe d'android.. et c'est aussi dans la page principale.
Vous devez vous connecter pour publier un commentaire.
Dans un projet Android, les constantes de la ressource en classe R sont déclarées comme ceci:
Cependant, comme de l'ADT 14, dans un projet de bibliothèque, ils seront déclarés comme ceci:
En d'autres termes, les constantes ne sont pas définitives, dans un projet de bibliothèque.
Par conséquent, votre code n'est plus de la compilation.
La solution pour cela est simple: Convertir l'instruction switch dans un if-else.
http://tools.android.com/tips/non-constant-fields
Vous pouvez convertir rapidement une
switch
déclaration à unif-else
de résultats en utilisant la suivante:Dans Eclipse
Déplacez votre curseur à l'
switch
mot-clé et appuyez sur Ctrl + 1, puis sélectionnezDans Android Studio
Déplacez votre curseur à l'
switch
mot-clé et appuyez sur Alt + Entrée, puis sélectionnezswitch
spécifiquement ne permet pas que?final
mot-clé, une variable peut être modifiée lors de l'exécution.final
n'est pas suffisant. Si la valeur de lafinal
variable est créée au moyen d'une méthode, il ne sera malheureusement pas de travail non plus.En décochant "Est la Bibliothèque" dans les Propriétés du projet a travaillé pour moi.
Solution qui peut être fait de cette façon:
Exemple:
Espère que cela va vous aider.
R. id.*, depuis ADT 14 ne sont pas plus a déclaré que final static int de sorte que vous ne pouvez pas utiliser l'interrupteur cas de construire. Vous pourrait utiliser en cas de clause else au lieu.
Simple solution de ce problème est :
Cliquez sur le commutateur puis appuyez sur CTL+1, Il va changer votre commutateur de if-else instruction de bloc, et permettra de résoudre votre problème
Comment au sujet de cette solution pour garder l'interrupteur belle place d'un if-else:
Donc, dans votre code, vous pouvez le faire:
Les énumérations sont statiques alors cela aura un impact très limité. La seule fenêtre de préoccupation serait le double de recherche impliqués (d'abord sur le plan interne SparseArray et, plus tard, sur l'interrupteur de la table)
Cela dit, cette enum peut aussi être utilisée pour extraire les éléments dans un fluide manière, en cas de besoin pour garder une référence à l'id... mais c'est une histoire pour une autre fois.
C'était en me jetant à cette erreur quand j'ai l'aide de l'interrupteur dans une fonction avec des variables déclarées dans ma classe:
Le problème a été résolu quand j'ai déclaré
final
pour les variables dans le début de la classe:enum
est une meilleure alternative àint
dans ce cas. L'appelant de la méthode ne sera pas en mesure d'appeler la fonction avec un type non valide.i have specific int types so its ok if i use ints
N'a pas vraiment de sens. Concernant enum exemple: 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
C'est votre hypothèse. Quelqu'un d'autre peut faire appel à la fonction incorrecte avec un nombre arbitraire. Avecenum
, vous n'avez pas besoin de supposer, elle est imposée par la langue.Je tiens à mentionner que, je suis tombé sur la même situation lorsque j'ai essayé d'ajouter une bibliothèque dans mon projet. Tout d'un coup, toutes les instructions switch commencé à montrer des erreurs!
Maintenant j'ai essayé de retirer la bibliothèque, j'ai ajouté, même alors, il n'a pas de travail.
comment jamais "quand j'ai nettoyé le projet" toutes les erreurs vient de sonner !