2010-07-12 5 views
2

J'ai du mal à comprendre ce qui suit: dans mon application localisée, j'ai un Enum dans une activité qui stocke des chaînes localisées (R.string.aString) qui sont comparées à une autre chaîne localisée.Énumération dans l'activité

Si alors que dans l'application que je change les paramètres régionaux et je suis revenu et lancez une nouvelle activité qui contient le Enum je constate que c'est les membres ont sont les mêmes qu'avant le changement de localisation.

Pour quelle raison?

Edit:

class Settings extends Activity 
{ 

    public enum SettingPreferenceScreen 
    { 
     Connection (R.string.Connection , xml_resource_1) 
     Legend (R,string.Legend ,xml_resource_2) 
     ....... 

    String key; 
    int res; 

    SettingPreferenceScreen(String key, int res) 
    {....} 

    public int getResource (String key) 
    { 
     for(SettingPreferenceScreen p : SettingPreferenceScreen.values()) 
     if(key.equals(p.key)) 
      return p.res; 

     return -1; 
    } 

    } 

} 
+0

S'il vous plaît, ajouter un extrait pertinent du code afin que nous puissions vous donner une réponse concrète. – Cristian

+0

Pouvez-vous expliquer ce que vous faites dans ce code? – Macarse

Répondre

2

Tout d'abord, essayez avoiding Enums lorsque vous développez pour Android.

En second lieu, je suppose que l'Enum se crée sur la méthode onCreate() de votre Activity et lorsque vous ouvrez l'application pour la deuxième fois cette méthode est pas appelée. Vérifiez le Activity's lifecycle.

+0

Non, c'est pourquoi je suis surpris aussi. –

+4

Les enums sont parfaits pour la lisibilité, et nous permettent de faire des conceptions cool. L'astuce "éviter enums" sur le site des développeurs Android est dans la catégorie "Design for performance", vous n'avez donc pas à les éviter lorsque vous souhaitez coder les 80% élégants de votre application. Deuxièmement, Enum ne peut pas être créé dans la méthode de certaines classes, elles sont initialisées lorsqu'elles sont chargées par le chargeur de classe. Ce que vous pouvez faire dans votre activité consiste uniquement à affecter différentes instances de l'objet Enum à la référence Enum. – ognian

+3

Éviter les énumérations ne fait plus partie des directives de performance référencées. Ceci suggère que le conseil était incorrect ou que la performance d'Enum n'est plus mauvaise à Dalvik –

2

R.string ne contient pas les chaînes, il contient des ressources constantes d'identité. (Valeurs int générées automatiquement.) Ces ID seront identiques quelle que soit la configuration. Les constantes d'identification sont utilisées pour extraire les ressources d'application d'un objet Resources (ou d'un Context, qui appelle par votre Resources). Lorsque vous appelez getString ou similaire, le système renvoie la ressource localisée le cas échéant.

Il semble que vous essayez de ré-implémenter des fonctionnalités que Android fournit déjà pour vous. Pouvez-vous nous donner plus de détails si ce n'est pas le cas?

1

Mise à jour: Il ne faut pas éviter énumérations dans Android plus ... Je ne sais pas quand il est venu, mais le sdk Android comprend maintenant proguard qui optimise le code à la compilation et remplace les énumérations avec int constantes (voir proguard.cfg).

En outre, le paragraphe que vous dire de ne pas utiliser les énumérations dans le guide de dev a été supprimé (http://developer.android.com/guide/practices/design/performance.html)