J'ai trouvé le R.string
assez génial pour conserver les chaînes codées en dur dans mon code, et j'aimerais continuer à l'utiliser dans une classe d'utilitaires 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 courrier électronique à partir d'un modèle en dehors de l'activité.
Est-il possible d'utiliser getString
en dehors d'une Context
ou Activity
? Je suppose que je pourrais passer à l’activité en cours, mais cela semble inutile. Corrigez-moi si j'ai tort, s'il-vous plait!
Edit: Pouvons-nous accéder aux ressources sans en utilisant Context
?
Vous pouvez utiliser:
Resources.getSystem().getString(Android.R.string.somecommonstuff)
... partout dans votre application, même dans les déclarations de constantes statiques . Malheureusement, il ne supporte que les ressources système uniquement.
Pour les ressources locales, utilisez cette solution . Ce n'est pas anodin, mais ça marche.
Malheureusement, le seul moyen d'accéder aux ressources de chaîne est d'utiliser une variable Context
(c'est-à-dire une Activity
ou une Service
). Ce que je fais habituellement dans ce cas, c'est simplement demander à l'appelant de passer dans le contexte.
Dans MyApplication
, qui étend Application
:
public static Resources resources;
Dans MyApplication
's onCreate
:
resources = getResources();
Vous pouvez maintenant utiliser ce champ depuis n’importe où dans votre application.
En passant, une des raisons pour lesquelles le symbole symbole est introuvable erreur peut être que votre IDE a importé Android.R; classe au lieu de la vôtre. Il suffit de changer importer Android.R; to importer votre.namespace.R;
Donc, 2 choses de base pour obtenir une chaîne visible dans la classe différente:
//make sure you are importing the right R class
import your.namespace.R;
//don't forget about the context
public void some_method(Context context) {
context.getString(R.string.YOUR_STRING);
}
Si vous utilisez une classe que vous utilisez dans une activité et que vous souhaitez accéder à la ressource de cette classe, je vous recommande de définir un contexte en tant que variable privée dans la classe et de l'initialiser dans le constructeur:
public class MyClass (){
private Context context;
public MyClass(Context context){
this.context=context;
}
public testResource(){
String s=context.getString(R.string.testString).toString();
}
}
Faire un instant de cours dans votre activité:
MyClass m=new MyClass(this);
Il vaut mieux utiliser quelque chose comme ceci sans contexte et activité:
Resources.getSystem().getString(R.string.my_text)
Cela devrait vous donner accès à applicationContext
de n’importe où, ce qui vous permettra d’obtenir applicationContext
partout où vous pourrez l’utiliser; Toast
, getString()
, sharedPreferences
, etc.
Le Singleton:
package com.domain.packagename;
import Android.content.Context;
/**
* Created by Versa on 10.09.15.
*/
public class ApplicationContextSingleton {
private static PrefsContextSingleton mInstance;
private Context context;
public static ApplicationContextSingleton getInstance() {
if (mInstance == null) mInstance = getSync();
return mInstance;
}
private static synchronized ApplicationContextSingleton getSync() {
if (mInstance == null) mInstance = new PrefsContextSingleton();
return mInstance;
}
public void initialize(Context context) {
this.context = context;
}
public Context getApplicationContext() {
return context;
}
}
Initialisez le singleton dans votre sous-classe Application
:
package com.domain.packagename;
import Android.app.Application;
/**
* Created by Versa on 25.08.15.
*/
public class mApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ApplicationContextSingleton.getInstance().initialize(this);
}
}
Si je ne me trompe pas, cela vous accroche partout dans applicationContext, appelez-le avec ApplicationContextSingleton.getInstance.getApplicationContext();
Vous ne devriez pas avoir à effacer cela à aucun moment.
N'oubliez pas de mettre à jour AndroidManifest.xml
pour utiliser cette sous-classe Application
:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.domain.packagename"
>
<application
Android:allowBackup="true"
Android:name=".mApplication" <!-- This is the important line -->
Android:label="@string/app_name"
Android:theme="@style/AppTheme"
Android:icon="@drawable/app_icon"
>
S'il vous plaît laissez-moi savoir si vous voyez quelque chose de mal, merci. :)
La meilleure approche de la réponse de Khemraj:
Classe App
class App : Application() {
companion object {
lateinit var instance: Application
lateinit var resourses: Resources
}
// MARK: - Lifecycle
override fun onCreate() {
super.onCreate()
instance = this
resourses = resources
}
}
Déclaration dans le manifeste
<application
Android:name=".App"
...>
</application>
Classe des constantes
class Localizations {
companion object {
val info = App.resourses.getString(R.string.info)
}
}
En utilisant
textView.text = Localizations.info