Ma déclaration switch-case fonctionne parfaitement bien hier. Mais quand j'ai exécuté le code plus tôt ce matin, eclipse m'a donné une erreur soulignant les instructions case en couleur rouge et dit: les expressions case doivent être une expression constante, c'est constant 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.
java
android
switch-statement
Archange sans cœur
la source
la source
R.id.playbtn
etc.? Tout est-il statique et définitif?R
est généralement générée par les outils IDE / dev, elle est donc généralement correcte pour la version d'Android utilisée.Réponses:
Dans un projet Android standard, les constantes de la classe de ressource R sont déclarées comme ceci:
Cependant, à partir d'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 ne se compilerait plus.
La solution pour cela est simple: convertissez l'instruction switch en une instruction if-else.
http://tools.android.com/tips/non-constant-fields
Vous pouvez rapidement convertir une
switch
instruction enif-else
instruction en utilisant les éléments suivants:Dans Eclipse
Déplacez votre curseur sur le
switch
mot - clé et appuyez sur Ctrl+ 1puis sélectionnezDans Android Studio
Déplacez votre curseur sur le
switch
mot - clé et appuyez sur Alt+ Enterpuis sélectionnezla source
final
mot - clé, une variable peut être modifiée lors de l'exécution.Décocher "Est une bibliothèque" dans les propriétés du projet a fonctionné pour moi.
la source
La solution peut être faite de cette façon:
Exemple:
J'espère que ceci vous aidera.
la source
R.id. *, puisque ADT 14 n'est plus déclaré comme int statique final donc vous ne pouvez pas utiliser dans la construction de cas de commutation. Vous pouvez utiliser la clause if else à la place.
la source
La solution simple à ce problème est:
Cliquez sur le commutateur , puis appuyez sur CTL + 1, cela changera votre commutateur en instruction de bloc if-else et résoudra votre problème
la source
Que diriez-vous de cette autre solution pour garder le commutateur agréable au lieu d'un if-else:
Donc, dans votre code, vous pouvez faire ceci:
Les énumérations sont statiques donc cela aura un impact très limité. La seule fenêtre de préoccupation serait la double recherche impliquée (d'abord sur le SparseArray interne et plus tard sur la table de commutation)
Cela dit, cette énumération peut également être utilisée pour récupérer les éléments de manière fluide, si nécessaire en gardant une référence à l'id ... mais c'est une histoire pour une autre fois.
la source
Cela me lançait cette erreur lorsque j'utilisais switch dans une fonction avec des variables déclarées dans ma classe:
Le problème a été résolu lorsque j'ai déclaré
final
aux variables au début de la classe:la source
enum
est une meilleure alternativeint
dans ce cas. L'appelant de la méthode ne pourra pas appeler la fonction avec un type non valide.i have specific int types so its ok if i use ints
Cela n'a pas vraiment de sens. Concernant l'exemple d'énumération: 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
Ceci est votre hypothèse. Quelqu'un d'autre peut appeler la fonction de manière incorrecte avec un nombre arbitraire. Avecenum
, vous n'avez pas besoin de supposer, il est imposé par la langue.Je voudrais 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 ont commencé à afficher des erreurs!
Maintenant, j'ai essayé de supprimer la bibliothèque que j'ai ajoutée, même alors cela ne fonctionnait pas. cependant " quand j'ai nettoyé le projet ", toutes les erreurs se sont produites!
la source