web-dev-qa-db-fra.com

Comment résoudre l'erreur: "Les ID de ressource ne peuvent pas être utilisés dans l'instruction switch dans Android modules de bibliothèque"

J'ai importé un projet Android créé par quelqu'un d'autre dans mon projet en tant que module de bibliothèque. J'obtiens l'erreur suivante même après le nettoyage et la reconstruction du projet:

Expression constante requise Les ID de ressource ne peuvent pas être utilisés dans l'instruction switch dans la bibliothèque Android

enter image description here

Comment puis-je corriger cette erreur?

12
Gp Master

Votre problème principal ici est que les instructions switch nécessitent des valeurs constantes comme comparateurs, que ce soit une valeur littérale, par exemple 1, "hello" ou une variable final déclarée au niveau de la classe. Android R.id les valeurs ont pas constantes depuis l'API 14, comme indiqué dans ce message d'erreur, elles ne peuvent donc pas être utilisées dans le cadre d'une instruction switch.

Votre alternative serait d'utiliser if else instructions car elles ne nécessitent pas de valeurs constantes, comme ceci:

if (v.getId() == R.id.something) {
    // Do something
} else if (v.getId() == R.id.something_else) {
   // Do something else
}
// Repeat however many times required
else {
   // Default value
}
8
Michael Dodd

Vous pouvez définir une balise pour chaque vue et utiliser la balise dans le boîtier de commutation. Quelque chose comme ça:

À votre avis:

...
Android:tag="test" />

Dans du code:

switch(v.getTag()){
    case "test":
    // Do Something
    break;
}
5
Hamlet Leon

Essayez d'appuyer sur F4 sur l'un de ces éléments:

public final class R {
    public static final class anim {
        public static int abc_fade_in = 0x7f010001;
        public static int abc_fade_out = 0x7f010002;

Ils ne sont pas déclarés définitifs.

Vous devez donc utiliser les instructions if-else pour ne pas basculer.

Comme note historique, ils étaient finaux dans les anciennes versions d'Android ...

Détails ici: Commute soudainement cassé

4
Elletlar

Comme le dit l'erreur, R.id.someId Ne sont pas des variables finales (int final statique), vous ne pouvez donc pas utiliser directement la clause switch dessus. Réécrivez plutôt le commutateur entier avec des instructions conditionnelles classiques if (v.getId() == R.id.openPictureBtn) { ... } else if (v.getId() == R.id.openCameraBtn) { ... }.

2
Miroslav Javorský