2010-09-29 12 views
22

Lors de la programmation pour Android, vous devez parfois utiliser des méthodes statiques. Mais lorsque vous essayez d'accéder à vos ressources dans une méthode statique avec getString(R.string.text), vous obtiendrez une erreur. Le rendre statique ne fonctionne pas.Android: getString (R.string) en méthode statique

Est-ce que quelqu'un sait un bon moyen de contourner cela? Les fichiers de ressources dans Android sont très utiles pour créer des éléments dans différentes langues ou apporter des modifications à un texte.

Répondre

24

D'une manière ou d'une autre, vous aurez besoin d'un contexte pour cela ... Pour les méthodes statiques, cela signifie probablement que vous devez transmettre un contexte lorsque vous les appelez.

6

Transmettez une instance Context (c'est-à-dire Activity) en tant qu'objet de paramètre à la méthode statique. Appelez ensuite getString sur le paramètre.

+0

Cela peut être une mauvaise idée. Si vous stockez des références à des contextes, vous risquez de provoquer une fuite de mémoire. – Falmarri

+6

Qu'est-ce qui vous a fait penser que je suggérais de stocker une référence de contexte? –

+0

@Falmarri: vous pouvez toujours utiliser 'getApplicationContext()', ce qui valide alors toute la durée de vie de l'application –

0

Le message ci-dessous donne un conseil pour créer une classe Application afin de sauvegarder votre contexte actuel. Votre nouvelle classe Application sera alors accessible depuis n'importe quelle autre méthode statique.

How can I get a resource content from a static context?

14

Vous pouvez utiliser Resources.getSystem().getStringArray(android.R.array.done);

+2

Ceci est une bonne solution seulement l'inconvénient est que vous ne pouvez utiliser que les ressources du système. –

+1

@ serv-inc - Ce n'est pas ce que le 'Resources.getSystem()' [documentation] (https://developer.android.com/reference/android/content/res/Resources.html#getSystem()) dit. – aroth

+1

@ serv-inc - Je veux dire que d'après la documentation de référence de Google, cela n'a pas d'importance si vous importez votre paquet.R; 'lorsque vous utilisez' Resources.getSystem(). GetStringArray() ', car' Resources.getSystem() 'renvoie" un objet Resources global partagé ** qui fournit un accès uniquement aux ressources système ** ". Ce qui suggère fortement que @SarenInden est correct et que le commentaire de suivi ne fera que tromper les gens en leur suggérant d'essayer quelque chose qui, selon la documentation officielle, ne fonctionnera pas. – aroth

-2

Une façon est que vous pouvez passer à votre contexte méthode statique. vérifier cela il fonctionne vraiment

Sons public class {

public static MediaPlayer getSoundTouch(Context context){ 
    return MediaPlayer.create(context, R.raw.touch); 

} 

public static MediaPlayer getSoundLeak(Context context){ 
    return MediaPlayer.create(context, R.raw.leak); 

} 

public static MediaPlayer getSoundFinish(Context context){ 
    return MediaPlayer.create(context, R.raw.finish); 

} 

}

2

Voici comment j'accéder à des ressources à l'intérieur des méthodes statiques. Peut-être pas idéal, mais.

D'abord, je tiens demande et a un champ statique public (s), et créer une méthode pour les initialiser:

public class MyApp extends Application { 

    // static resources 
    public static String APP_NAME; 

    public static void initResources(Context context) { 
    APP_NAME = context.getResources().getString(R.string.app_name); 
    } 
} 

Et dans mon manifeste, j'inscrire le étendu Application:

<application 
    android:name=".MyApp"/> 

Dans mon activité de démarrage (MainActivity), je fais un appel à initialiser les ressources statiques:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    MyApp.initResources(this); 
} 
Alors

partout dans votre projet, après MainActivity.onCreate (Bundle b) a été exécuté, vous pouvez appeler des méthodes statiques qui ont accès à vos ressources statiques spécifiées:

public static void printAppName() { 
    Log.w("tag", "my app name: " + MyApp.APP_NAME); 
}