web-dev-qa-db-fra.com

erreur de déclaration de casse: les expressions de casse doivent être des expressions constantes

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.

123
HeartlessArchangel

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'.

267
Benito Bertoli

Décocher "Est la bibliothèque" dans les propriétés du projet a fonctionné pour moi.

51
rick

La solution peut être faite de cette façon:

  1. Juste assigner le valeur à Integer
  2. Faire variable à final

Exemple:

public static final int cameraRequestCode = 999;

J'espère que cela vous aidera.

11
Hiren Patel

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.

8
Pir Fahim Shah

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.

8
Blackbelt

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.

7
pablisco

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;
3
aimiliano

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!

2
Muhammad Riyaz