web-dev-qa-db-fra.com

Accès aux ressources sans contexte

J'essaie de mettre la configuration, comme 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 (ressemble à 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 besoin de rien d'autre que des ressources en plus d'une seule fois pendant l'instanciation. Par conséquent, devoir passer dans un contexte à chaque appel de getInstance () serait un gaspillage complet.

En outre, cela 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.

28
mnemy

Utilisation

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 .

76
Gangnus

Vous pouvez étendre la classe d'application principale et y fournir des assistants universels 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 l'exécution d'une partie de votre application (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 y accéder. En supposant que votre application personnalisée se trouve à la racine de l'espace de noms de votre application:

<application
 Android:name=".MyApplication"
 ... >
14
SandWyrm

Je recommanderais 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 à l'intérieur de 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();
}

Vous pouvez maintenant utiliser les éléments suivants n'importe où dans n'importe quelle classe:

Context context = AntiMorphActivity.getContext();
String packageName = context.getPackageName();
int id = context.getResources().getIdentifier("web_page", "raw", packageName);
1
goodies4uall

Malheureusement, je ne pense pas qu'il existe un véritable moyen de contourner cela. Je mets quelque chose comme ça, et passe également le 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());
1
sgarman

La réponse de 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 plusieurs.

Est-il possible de lire un fichier texte brut sans référence de contexte dans un projet de bibliothèque Android

0
andrew pate