Accès aux ressources sans contexte
J'essaie de mettre la configuration, telle que les URL/etc, dans un dossier de ressources pour une classe utilitaire à utiliser. Cependant, je ne veux pas passer le Contexte des activités partout. Je voudrais pouvoir accéder à une ressource via un nom de chemin (semble être des actifs / a été conçu pour cette utilisation), sans utiliser de contexte pour accéder à la ressource.
Dans ce cas particulier, je veux qu'un singleton utilise quelque chose dans la configuration quand il est instancié. Il n'a pas besoin de quoi que ce soit des ressources en plus de cela une fois pendant l'instanciation. Par conséquent, avoir à passer dans un contexte chaque fois que getInstance() est appelé serait un gaspillage complet.
En outre, ceci est spécifique à la configuration de l'application, et ne doit pas être stocké dans un fichier système partagé ou quelque chose comme ça.
5 réponses
Utiliser
Resources.getSystem().getString(android.R.string.someuniversalstuff)
Vous pouvez L'utiliser absolument partout dans votre application, même dans la déclaration de constantes statiques! Mais pour les ressources système uniquement.
Pour les ressources locales, utilisez Cette solution .
Vous pouvez étendre la classe d'application principale et y fournir des aides universelles pour accéder aux ressources. Cela soulage le besoin de contexte car l'application fournirait le contexte au lieu de l'appelant. La classe d'application est de style singleton et doit toujours être disponible pendant que n'importe quelle partie de votre application est en cours d'exécution (y compris les services).
public class MyApplication extends Application {
protected static MyApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public static Resources getResources() {
return instance.getResources();
}
}
Cela vous donne accès à:
MyApplication.getResources()....
Assurez-vous de déclarer votre application personnalisée dans votre manifeste pour accéder à ce. En supposant que votre application personnalisée est à la racine de l'espace de noms de votre application:
<application
android:name=".MyApplication"
... >
Malheureusement, je ne pense pas qu'il y ait un vrai moyen de contourner cela. Je pose le mien quelque chose comme ça, et passe aussi dans getApplicationContext () au lieu du contexte d'activité.
public static AppController getAppController(Context context){
if(self == null) {
//Create instance
self = new AppController();
}
return self;
}
Puis:
appController = AppController.getAppController(getApplicationContext());
Je recommande de faire ce qui suit: Plutôt que de passer du contexte partout, faites de votre classe d'activité une classe singleton avec une fonction publique qui renvoie le contexte:
private static ActivityMain instance;
Initialiser dans onCreate () avant super.onCreate ():
instance = this;
Ajoutez ensuite ces fonctions publiques à votre activité:
/** Get singleton instance of activity **/
public static ActivityMain getInstance() {
return instance;
}
/** Returns context of this activity **/
public static Context getContext(){
return instance.getApplicationContext();
}
Maintenant, vous pouvez utiliser ce qui suit n'importe où dans toute la classe:
Context context = AntiMorphActivity.getContext();
String packageName = context.getPackageName();
int id = context.getResources().getIdentifier("web_page", "raw", packageName);
La réponse stackoverflow à la question ci-dessous montre comment utiliser POJO pour obtenir un flux vers une ressource, si vous fournissez son chemin. Cela peut être utile dans les cas où vous devez sélectionner une ressource spécifique parmi l'une des nombreuses.