Est-il possible d'obtenir des ressources dans un bloc de contexte statique?

Je veux créer une table Hash statique pour convertir des chaînes en entiers . La mise en garde ici est que je veux utiliser des chaînes que j'ai définies comme des ressources dans plusieurs listes dans les fichiers XML .

Je peux écrire ceci, en utilisant uniquement des identifiants de ressources:

  • Comment capturer des événements clés à partir d'un casque bluetooth avec Android
  • Comment simuler: pseudo-classe css active dans Android sur des éléments non liés?
  • Toute idée pourquoi adb ne reconnaît pas mon nexus 4 sur Mac
  • Android webview s'adapte à tous les contenus à l'écran
  • Canvas Pinch-Zoom to Point Within Bounds
  • RTSP sur le streaming vidéo HTTPS par GStreamer
  • public class MyActivity extends Activity { private static Map<Integer, Integer> views = new HashMap<Integer, Integer>(); static { views.put(R.string.full_text, MessageTable.VIEW_FULL); views.put(R.string.only_text, MessageTable.VIEW_MSG); views.put(R.string.tag_text, MessageTable.VIEW_TAGMSG); } 

    Je n'obtiens aucune erreur, mais ce que je devrais vraiment faire, c'est quelque chose comme ça:

     public class MyActivity extends Activity { private static Map<String, Integer> views = new HashMap<String, Integer>(); static { views.put(getResources().getString(R.string.full_text), MessageTable.VIEW_FULL); views.put(getResources().getString(R.string.only_text), MessageTable.VIEW_MSG); views.put(getResources().getString(R.string.tag_text), MessageTable.VIEW_TAGMSG); } 

    Ce qui me donne l'erreur suivante dans Eclipse:

     Cannot make a static reference to the non-static method getResources() from the type ContextWrapper 

    Le message a du sens, mais ce qui n'a pas de sens, c'est que les ressources ne sont pas accessibles à partir du bloc statique, on pourrait penser que les variables statiques étaient créées sur mesure pour utiliser les ressources.
    Je suppose que je peux peupler la table Hash pendant le constructeur d'objet, mais cela impliquerait de le faire au mauvais endroit.

  • RuntimeException sur Camera.setParameters () sur nexus one
  • Android L conflit d'autorisation entre libération et depug apks
  • Empêchez l'application Android de démarrer
  • Quel est l'événement recommandé pour la mise à jour de l'interface utilisateur de navigation WebView?
  • ImageView en circulaire par xml
  • Android - R ne peut pas être résolu à une variable
  • 5 Solutions collect form web for “Est-il possible d'obtenir des ressources dans un bloc de contexte statique?”

    getResources() (court pour ~ MyActivity.this.getResources() ) nécessite un objet contextuel qui n'est pas initialisé à ce moment-là. Étant donné que le contexte n'est disponible que lorsque vous onCreate sur onCreate vous ne pouvez même pas le faire au moment de la construction de MyActivity .

    La raison en est que le gestionnaire d'activité qui instancie votre classe MyActivity doit déterminer la configuration (orientation, taille de l'écran, langue, …) avant de savoir quelles ressources doivent être extraites du xml. -> Les ressources ne sont pas statiques et ne peuvent être consultées à partir du contexte statique.

    Donc, je suppose qu'il n'y a aucun moyen de faire ces opérations dans onCreate ou plus tard.

    Edit: Bien que vous pouvez certainement mettre à jour le HashMap statique (ou un Context statique) de onCreate je ne le recommanderais pas puisque vous pouvez avoir plusieurs instances de la même activité avec des configurations éventuellement différentes / changeantes. Le stockage d'un Context statique est également un excellent moyen de créer une fuite de mémoire

     public Static Resources mResources; public MyApplication extends Application { @Override public void onCreate() { mResources = getResources(); } } 

    Une fois que vous avez la référence statique aux Ressources, vous pouvez vous référer à l'ensemble de l'application. Cependant, je ne suis pas sûr de savoir si cela va introduire une fuite momory ou pas;

    Une chose que vous pouvez faire est de créer une classe d' Application et de l'enregistrer dans votre AndroidManifest.xml. Ensuite, supprimez la méthode onCreate et définissez la classe Application comme une référence statique, puis appuyez sur la classe Activité pour exécuter l'initialiseur statique. La classe d' Application sera exécutée lorsque l'apk est chargé dans la mémoire afin qu'il soit toujours exécuté avant toute Activity .

    Il y a des inconvénients importants à cela. Le plus évident, à mon avis, est si le système change et que vous avez ajouté des traductions à ces ressources; Alors vous aurez des chaînes incohérentes parce que l'application utilisera la valeur par défaut ou quelle que soit la langue utilisée lors de la lancement de l'application. Les ressources de chaîne sont influencées par le système de gestion des ressources d'Android, de sorte que les modifications apportées à des choses comme l'orientation, le langage du système, les dimensions de l'écran peuvent influencer ces valeurs. Voilà les raisons pour lesquelles les activités sont réinitialisées lorsque

    En bref, vous préférez utiliser des paires de valeurs-clés constantes Strings pour ce travail. Si vous devez utiliser des ressources de chaîne pour mieux gérer les traductions. Je les chargerais chaque fois que l'activité démarrera. Sinon, vous risquez des fuites de mémoire et des traductions de chaîne incompatibles.

     public MyApplication extends Application { public static Context GlobalContext = null; @Override protected void onCreate() { MyApplication.GlobalContext = this; // Touch the activity class. MyActivity activity = new MyActivity(); // Throw it away by not using it. // invalidate handle to prevent GC leaks. GlobalContext = null; } } public class MyActivity extends Activity { private static Map<String, Integer> views = new HashMap<String, Integer>(); static { Context context = MyApplication.GlobalContext; Resources res = context.getResources(); views.put(res.getString(R.string.full_text), MessageTable.VIEW_FULL); views.put(res.getString(R.string.only_text), MessageTable.VIEW_MSG); views.put(res.getString(R.string.tag_text), MessageTable.VIEW_TAGMSG); } } 

    Vous pouvez toujours garder une référence statique à ApplicationContext. Une façon possible est décrite ici: Une façon statique d'obtenir «Contexte» sur Android?

    Je ne sais pas quelle est la meilleure façon, mais, par exemple, dans mon application, j'ai un Singleton (appelé GuiaUtil) qui maintient mes activités et mon contexte actuels.

     private static Map<String, Integer> views = new HashMap<String, Integer>(); static { views.put(GuiaUtil.instance().getAppContext().getResources().getString(R.string.full_text), MessageTable.VIEW_FULL); views.put(GuiaUtil.instance().getAppContext().getResources().getString(R.string.only_text), MessageTable.VIEW_MSG); views.put(GuiaUtil.instance().getAppContext().getResources().getString(R.string.tag_text), MessageTable.VIEW_TAGMSG); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.