J'ai consulté diverses questions-réponses sur SO similaires à cette question, mais je n'ai pas trouvé de solution.
Ce que j'ai est une énumération qui représente différentes façons de regarder un guide TV ...
Dans la classe NDroid Application
static enum guideView {
GUIDE_VIEW_SEVEN_DAY,
GUIDE_VIEW_NOW_SHOWING,
GUIDE_VIEW_ALL_TIMESLOTS
}
... lorsque l'utilisateur change la vue, un gestionnaire d'événements reçoit un int
de 0-2 et j'aimerais faire quelque chose comme ceci ...
Dans un gestionnaire d'événement Android Activity
onClick(DialogInterface dialog, int which)
// 'which' is an int from 0-2
switch (which) {
case NDroid.guideView.GUIDE_VIEW_SEVEN_DAY:
...
break;
}
Je suis habitué aux énoncés C # et aux instructions select/case qui autoriseraient quelque chose comme ce qui précède et je sais que Java fait les choses différemment, mais je ne peux tout simplement pas comprendre ce que je dois faire.
Est-ce que je vais devoir recourir à des déclarations if
? Il n’y aura probablement que 3 choix pour que je puisse le faire, mais je me demandais comment faire avec switch-case en Java.
EDIT Désolé de ne pas avoir complètement développé le problème car je le considérais comme un problème générique Java. J'ai ajouté à la question pour expliquer un peu plus loin.
Il n'y a rien qui soit spécifique à Android, c'est pourquoi je ne l'ai pas étiqueté comme Android mais l'énumération est définie dans la classe Application
et le code où je souhaite le commutateur est dans un Activity
. L'énumération est statique car j'ai besoin d'y accéder à partir de plusieurs activités.
La partie qui vous manque est la conversion du nombre entier en un type-safe. Java ne le fera pas automatiquement. Il y a deux façons de s'y prendre:
guideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
Déterminez la valeur enum représentée par la valeur int puis activez-la.
enum GuideView {
SEVEN_DAY,
NOW_SHOWING,
ALL_TIMESLOTS
}
// Working on the assumption that your int value is
// the ordinal value of the items in your enum
public void onClick(DialogInterface dialog, int which) {
// do your own bounds checking
GuideView whichView = GuideView.values()[which];
switch (whichView) {
case SEVEN_DAY:
...
break;
case NOW_SHOWING:
...
break;
}
}
Vous trouverez peut-être plus utile/moins enclin aux erreurs d'écrire une implémentation personnalisée valueOf
prenant vos valeurs entières en tant qu'argument pour résoudre la valeur enum appropriée et vous permettant de centraliser la vérification de vos limites.
Si whichView
est un objet de GuideView Enum, la procédure suivante fonctionne bien. Veuillez noter qu'il n'y a pas de qualificateur pour la constante après case
.
switch (whichView) {
case SEVEN_DAY:
...
break;
case NOW_SHOWING:
...
break;
}
Les énumérations ne doivent pas être qualifiées dans l'étiquette de casse comme ce que vous avez NDroid.guideView.GUIDE_VIEW_SEVEN_DAY
, mais vous devez plutôt retirer la qualification et utiliser GUIDE_VIEW_SEVEN_DAY
.
J'aime quelques utilisations de Java enum:
enum avec paramètres de valeur:
enum StateEnum {
UNDEFINED_POLL ( 1 * 1000L, 4 * 1000L),
SUPPORT_POLL ( 1 * 1000L, 5 * 1000L),
FAST_POLL ( 2 * 1000L, 4 * 60 * 1000L),
NO_POLL ( 1 * 1000L, 6 * 1000L);
...
}
commutateur exemple:
private void queuePoll(StateEnum se) {
// debug print se.name() if needed
switch (se) {
case UNDEFINED_POLL:
...
break;
case SUPPORT_POLL:
...
break;
Cela devrait fonctionner de la manière que vous décrivez. Quelle erreur obtenez vous? Si vous pouviez coller votre code avec Pastebin, cela aiderait.
http://download.Oracle.com/javase/tutorial/Java/javaOO/enum.html
EDIT: Êtes-vous sûr de vouloir définir une énumération statique? Cela ne me semble pas correct. Une énumération ressemble beaucoup à tout autre objet. Si votre code est compilé et exécuté mais donne des résultats incorrects, ce serait probablement pour cette raison.
Exemple de fonction associative court:
public String getIcon(TipoNotificacao tipo)
{
switch (tipo){
case Comentou : return "fa fa-comments";
case ConviteEnviou : return "icon-envelope";
case ConviteAceitou : return "fa fa-bolt";
default: return "";
}
}
Comme @Dhanushka l'a dit, omettre le qualificatif dans "switch" est la clé.
enumerations accessing is very simple in switch case
private TYPE currentView;
//declaration of enum
public enum TYPE {
FIRST, SECOND, THIRD
};
//handling in switch case
switch (getCurrentView())
{
case FIRST:
break;
case SECOND:
break;
case THIRD:
break;
}
//getter and setter of the enum
public void setCurrentView(TYPE currentView) {
this.currentView = currentView;
}
public TYPE getCurrentView() {
return currentView;
}
//usage of setting the enum
setCurrentView(TYPE.FIRST);
avoid the accessing of TYPE.FIRST.ordinal() it is not recommended always
Je le fais comme
public enum State
{
// Retrieving, // the MediaRetriever is retrieving music //
Stopped, // media player is stopped and not prepared to play
Preparing, // media player is preparing...
Playing, // playback active (media player ready!). (but the media player
// may actually be
// paused in this state if we don't have audio focus. But we
// stay in this state
// so that we know we have to resume playback once we get
// focus back)
Paused; // playback paused (media player ready!)
//public final static State[] vals = State.values();//copy the values(), calling values() clones the array
};
public State getState()
{
return mState;
}
Et utiliser dans la déclaration de commutateur
switch (mService.getState())
{
case Stopped:
case Paused:
playPause.setBackgroundResource(R.drawable.selplay);
break;
case Preparing:
case Playing:
playPause.setBackgroundResource(R.drawable.selpause);
break;
}