J'ai trouvé R.string
assez génial pour garder les chaînes codées en dur hors de mon code, et j'aimerais continuer à l'utiliser dans une classe utilitaire qui fonctionne avec les modèles de mon application pour générer une sortie. Par exemple, dans ce cas, je génère un e-mail à partir d'un modèle en dehors de l'activité.
Est-il possible d'utiliser en getString
dehors d'un Context
ouActivity
? Je suppose que je pourrais passer dans l'activité actuelle, mais cela semble inutile. Corrigez-moi si j'ai tort, s'il-vous plait!
Edit: pouvons-nous accéder aux ressources sans utiliser Context
?
java
android
string
android-resources
android-context
SapphireSun
la source
la source
Réponses:
Oui, nous pouvons accéder aux ressources sans utiliser `Context`
Vous pouvez utiliser:
... partout dans votre application, même dans les déclarations de constantes statiques. Malheureusement, il prend uniquement en charge les ressources système .
Pour les ressources locales, utilisez cette solution . Ce n'est pas anodin, mais cela fonctionne.
la source
android.content.res.Resources$NotFoundException: String resource ID #0x7f0f0061
Malheureusement, la seule façon d'accéder à l'une des ressources de chaîne est d'utiliser un
Context
(c'est-à-dire unActivity
ouService
). Ce que j'ai l'habitude de faire dans ce cas, c'est d'exiger simplement que l'appelant passe dans le contexte.la source
ctx.getString(ctx.R.string.blah);
Context
afin que vous puissiez l'utiliser à partir d'une activité ou d'un service.ctx.R.string.blah
, utilisez simplementR.string.blah
symbol not found error
vient le produit, mais assurez-vous que vous avezR
importé en haut de la classe.Dans
MyApplication
, qui s'étendApplication
:Dans
MyApplication
« sonCreate
:Vous pouvez maintenant utiliser ce champ depuis n'importe où dans votre application.
la source
BTW, l'une des raisons de l' erreur de symbole non trouvé peut être que votre IDE a importé android.R; classe au lieu de la vôtre. Il suffit de modifier l' importation android.R; à importer your.namespace.R;
Donc 2 choses de base pour rendre la chaîne visible dans les différentes classes:
la source
Approche unique
App.getRes().getString(R.string.some_id)
(1) Créez ou modifiez (s'il existe déjà) votre
Application
classe.(2) Ajoutez un champ de nom à votre
manifest.xml
<application
tag.Vous êtes maintenant prêt à partir. Utilisez
App.getRes().getString(R.string.some_id)
n'importe où dans l'application.la source
Si vous avez une classe que vous utilisez dans une activité et que vous souhaitez avoir accès à la ressource dans cette classe, je vous recommande de définir un contexte comme variable privée dans la classe et de l'initier dans le constructeur:
Faire un instant de classe dans votre activité:
la source
Cela devrait vous permettre d'accéder à
applicationContext
n'importe où vous permettant d'accéder àapplicationContext
n'importe quel endroit qui peut l'utiliser;Toast
,getString()
,sharedPreferences
, Etc.The Singleton:
Initialisez le singleton dans votre
Application
sous-classe:Si je ne me trompe pas, cela vous donne un crochet à applicationContext partout, appelez-le avec
ApplicationContextSingleton.getInstance.getApplicationContext();
Vous ne devriez pas avoir besoin d'effacer cela à tout moment, car lorsque l'application se ferme, cela va de toute façon avec elle.N'oubliez pas de mettre à jour
AndroidManifest.xml
pour utiliser cetteApplication
sous - classe:S'il vous plaît faites le moi savoir si vous voyez quelque chose de mal ici, merci. :)
la source
La meilleure approche de la réponse de Khemraj:
Classe d'application
Déclaration dans le manifeste
Classe de constantes
En utilisant
la source
Il vaut mieux utiliser quelque chose comme ça sans contexte ni activité :
la source
D'une manière ou d'une autre, je n'aimais pas les solutions hacky de stockage de valeurs statiques, nous avons donc proposé une version un peu plus longue mais propre qui peut également être testée.
Trouvé 2 façons possibles de le faire-
par exemple
Avant de lire: cette version utilise
Data binding
XML-
Activité / Fragment-
Parfois, vous devez modifier le texte en fonction d'un champ dans un modèle. Donc, vous lieriez également ce modèle aux données et puisque votre activité / fragment connaît le modèle, vous pouvez très bien récupérer la valeur, puis lier les données à la chaîne en fonction de cela.
la source
Vous pouvez le faire dans Kotlin en créant une classe qui étend Application, puis utilisez son contexte pour appeler les ressources n'importe où dans votre code
Votre classe d'application ressemblera à ceci
Déclarez votre classe Application dans AndroidManifest.xml (très important)
Pour accéder par exemple à un fichier de chaîne, utilisez le code suivant
la source
Voici ce que j'ai fait, dans votre activité principale, créez une variable statique pour le contexte, comme indiqué ci-dessous:
et dans onCreate () initialiser mContext à ceci;
Ensuite, dans le fichier dans lequel vous souhaitez accéder au contexte, par exemple,
Maintenant, vous pouvez obtenir une ressource de chaîne de la manière suivante,
la source
J'ai utilisé
getContext().getApplicationContext().getString(R.string.nameOfString);
Cela fonctionne pour moi.la source
getContext()
est disponible partout?!