web-dev-qa-db-fra.com

getString en dehors d'un contexte ou d'une activité

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?

208
SapphireSun

Oui, nous pouvons accéder aux ressources sans utiliser `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.

354
Gangnus

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.

106
Erich Douglass

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.

28
konmik

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);
}
21

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);
3
Malus Jan

Il vaut mieux utiliser quelque chose comme ceci sans contexte et activité:

Resources.getSystem().getString(R.string.my_text)
0
reza_khalafi

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. :)

0
Versa

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
0
Mickael Belhassen