J'essaye d'utiliser la méthode getResources dans une classe de non-activité. Comment puis-je obtenir la référence à l'objet «ressources» pour pouvoir accéder au fichier xml stocké dans le dossier des ressources?
Exemple:
XmlPullParser xpp = getResources().getXml(R.xml.samplexml);
Context
objets dans Android. Cela peut entraîner des fuites de mémoire. Voir ma réponse pour une solution moins risquée.Réponses:
Vous devrez lui passer un
context
objet. Soitthis
si vous avez une référence à la classe dans une activité, soitgetApplicationContext()
Ensuite, vous pouvez l'utiliser dans le constructeur (ou le définir sur une variable d'instance):
Où le constructeur accepte
Context
comme paramètrela source
Context
objets dans Android. Cela peut entraîner des fuites de mémoire.Context
les objets sont désagréables car il n'est pas immédiatement évident s'ils concernent l'ensemble de l'application ou de l'activité. Des fuites de mémoire (et des plantages) se produisent lorsque vous fournissez le mauvais. Par exemple, fournir unActivity
à un objet statique qui a besoin d'unContext
et ledit objet n'est pas détruit lorsque leActivity
est conduit à laActivity
persistance après onDestroy, car il ne peut pas être GC en raison de cet autre objet statique. Alors oui, cela peut être dangereux, mais sachant pourquoi c'est dangereux, je pense qu'il est important de le mentionner ici.Ce n'est pas une bonne idée de faire
Context
circuler des objets. Cela conduira souvent à des fuites de mémoire. Ma suggestion est que vous ne le faites pas. J'ai créé de nombreuses applications Android sans avoir à passer de contexte à des classes non liées à l'activité dans l'application. Une meilleure idée serait d'obtenir les ressources auxquelles vous avez besoin d'accéder pendant que vous êtes dans leActivity
ouFragment
et de les conserver dans une autre classe. Vous pouvez ensuite utiliser cette classe dans toutes les autres classes de votre application pour accéder aux ressources, sans avoir à passer d'Context
objets.la source
Il existe un autre moyen sans créer d'objet également. Vérifiez la référence . Merci pour @cristian. Ci-dessous, j'ajoute les étapes mentionnées dans la référence ci-dessus. Pour moi, je n'aime pas créer un objet pour cela et y accéder. J'ai donc essayé d'accéder au
getResources()
sans créer d'objet. J'ai trouvé ce post. J'ai donc pensé à l'ajouter comme réponse.Suivez les étapes pour accéder
getResources()
à une classe sans activitéwithout passing a context
via l'objet.Application
, par exemplepublic class App extends Application {
. Reportez-vous au code à côté des étapes.android:name
attribut de votre<application>
balise dansAndroidManifest.xml
pour pointer vers votre nouvelle classe, par exempleandroid:name=".App"
onCreate()
méthode de votre instance d'application, enregistrez votre contexte (par exemplethis
) dans un champ statique nomméapp
et créez une méthode statique qui renvoie ce champ, par exemplegetContext()
.App.getContext()
chaque fois que vous souhaitez obtenir un contexte, puis nous pouvons utiliserApp.getContext().getResources()
pour obtenir des valeurs à partir des ressources.Voici à quoi cela devrait ressembler:
la source
voici ma réponse:
}
et l'appel peut être comme ceci:
la source
cela peut être fait en utilisant
la source
Context
objets n'est pas une pratique saineNous pouvons utiliser le contexte comme celui-ci, essayez maintenant Où le parent est le ViewGroup.
la source
bon pas besoin de passer le contexte et de faire tout ça ... faites simplement ceci
Edit: où le parent est le ViewGroup
la source
Ça fonctionne toujours pour moi:
Pas lié à cette question mais exemple d'utilisation d'un fragment pour accéder aux ressources / activités du système comme ceci:
la source
Dans l'application de guide touristique du cours Basic ANdroid d'Udacity, j'ai utilisé le concept de Fragments. Je suis resté bloqué pendant un certain temps, rencontrant des difficultés pour accéder à certaines ressources de chaîne décrites dans des chaînes, un fichier xml. J'ai enfin une solution.
Ceci est la classe d'activité principale
package com.example.android.tourguidekolkata;
Il s'agit de la classe non Activity qui étend FragmentPageAdapter
la source
Dans une classe simple, déclarez le contexte et récupérez les données du fichier du dossier res
Dans la classe d'activité, déclarez comme ceci
la source
Je suis une solution en retard mais complète;: Exemple de classe, utilisez le contexte comme ceci: -
Avertissement (fuites de mémoire)
Comment résoudre ça?
Option 1 : Au lieu de passer le contexte d'activité, c'est-à-dire celui-ci à la classe singleton, vous pouvez passer applicationContext ().
Option 2: si vous devez vraiment utiliser le contexte d'activité, lorsque l'activité est détruite, assurez-vous que le contexte que vous avez passé à la classe singleton est défini sur null.
J'espère que ça aide..∆∆∆∆
la source
dans votre MainActivity:
ResourcesHelper:
puis utilisez-le partout
la source