Ma déclaration de cas de commutation fonctionne parfaitement bien hier. Mais quand j’ai exécuté le code ce matin, Eclipse m’a donné une erreur en soulignant les instructions de cas en couleur rouge et disant: les expressions de cas doivent être des expressions constantes, 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.
Dans un projet standard Android, les constantes de la classe de ressources R sont déclarées comme suit:
public static final int main=0x7f030004;
Cependant, à partir de l’ADT 14, dans un projet de bibliothèque, ils seront déclarés comme suit:
public static int main=0x7f030004;
En d'autres termes, les constantes ne sont pas définitives dans un projet de bibliothèque. Par conséquent, votre code ne serait plus compilé.
La solution à cela est simple: convertissez l’instruction switch en une instruction if-else.
public void onClick(View src)
{
int id = src.getId();
if (id == R.id.playbtn){
checkwificonnection();
} else if (id == 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(" ");
} else if (id == R.id.btnmenu){
openOptionsMenu();
}
}
http://tools.Android.com/tips/non-constant-fields
Vous pouvez rapidement convertir une instruction switch
en une instruction if-else
déclaration utilisant les éléments suivants:
Dans Eclipse
Déplacez votre curseur sur le mot clé switch
et appuyez sur Ctrl + 1 puis sélectionnez
Convertissez 'switch' en 'if-else'.
Dans Android Studio
Déplacez votre curseur sur le mot clé switch
et appuyez sur Alt + Enter puis sélectionnez
Remplacez 'switch' par 'if'.
Décocher "Est la bibliothèque" dans les propriétés du projet a fonctionné pour moi.
La solution peut être faite de cette façon:
Exemple:
public static final int cameraRequestCode = 999;
J'espère que cela vous aidera.
La solution simple à ce problème est la suivante:
Cliquez sur le commutateur, puis appuyez sur CTL + 1, Il changera votre commutateur en instruction if-else block et résoudra votre problème.
R.id. *, étant donné que les ADT 14 ne sont plus déclarés comme int statiques finales, vous ne pouvez donc pas les utiliser dans une construction de commutateur. Vous pouvez utiliser la clause if else à la place.
Que diriez-vous de cette autre solution pour garder le commutateur Nice au lieu d’un if-else:
private enum LayoutElement {
NONE(-1),
PLAY_BUTTON(R.id.playbtn),
STOP_BUTTON(R.id.stopbtn),
MENU_BUTTON(R.id.btnmenu);
private static class _ {
static SparseArray<LayoutElement> elements = new SparseArray<LayoutElement>();
}
LayoutElement(int id) {
_.elements.put(id, this);
}
public static LayoutElement from(View view) {
return _.elements.get(view.getId(), NONE);
}
}
Donc, dans votre code, vous pouvez faire ceci:
public void onClick(View src) {
switch(LayoutElement.from(src)) {
case PLAY_BUTTTON:
checkwificonnection();
break;
case STOP_BUTTON:
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 MENU_BUTTON:
openOptionsMenu();
break;
}
}
Les énumérations étant statiques, leur impact sera très limité. La seule fenêtre d'inquiétude 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 objets de manière fluide, si nécessaire en conservant une référence à l'identifiant ... mais c'est une histoire pour une autre fois.
Cela me renvoyait cette erreur lorsque j'utilisais switch dans une fonction avec des variables déclarées dans ma classe:
private void ShowCalendar(final Activity context, Point p, int type)
{
switch (type) {
case type_cat:
break;
case type_region:
break;
case type_city:
break;
default:
//sth
break;
}
}
Le problème a été résolu lorsque j'ai déclaré final
aux variables au début de la classe:
final int type_cat=1, type_region=2, type_city=3;
Je voudrais mentionner que j'ai rencontré la même situation lorsque j'ai essayé d'ajouter une bibliothèque à mon projet. Tout d'un coup, toutes les instructions de commutateur ont commencé à afficher des erreurs!
Maintenant, j'ai essayé de supprimer la bibliothèque que j'ai ajoutée, même si cela ne fonctionnait pas. mais comment "quand j'ai nettoyé le projet" toutes les erreurs ont juste été commises!