Comment puis-je obtenir un contenu de ressource à partir d’un contexte statique?

Je veux lire les chaînes d’un fichier xml avant de faire autre chose comme setText sur les widgets. Comment puis-je faire cela sans object d’activité pour appeler getResources() ?

  1. Créer une sous-classe de l’ Application , par exemple public class App extends Application {
  2. Définissez l’atsortingbut android:name de votre dans le AndroidManifest.xml pour qu’il pointe vers votre nouvelle classe, par exemple android:name=".App"
  3. Dans la méthode onCreate() de votre instance d’application, enregistrez votre contexte (par exemple, this ) dans un champ statique nommé mContext et créez une méthode statique qui renvoie ce champ, par exemple getContext() :

Voici comment cela devrait ressembler:

 public class App extends Application{ private static Context mContext; @Override public void onCreate() { super.onCreate(); mContext = this; } public static Context getContext(){ return mContext; } } 

Maintenant, vous pouvez utiliser: App.getContext() chaque fois que vous voulez obtenir un contexte, puis getResources() (ou App.getContext().getResources() ).

Utilisation

 Resources.getSystem().getSsortingng(android.R.ssortingng.cancel) 

Vous pouvez les utiliser partout dans votre application, même dans les déclarations de constantes statiques! Mais pour les ressources système uniquement!

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 donne un access à applicationContext partout, appelez-le avec ApplicationContextSingleton.getInstance.getApplicationContext(); Vous ne devriez pas avoir à effacer cela à aucun moment, car lorsque l’application se ferme, cela va de toute façon.

N’oubliez pas de mettre à jour AndroidManifest.xml pour utiliser cette sous-classe Application :

 < ?xml version="1.0" encoding="utf-8"?>   android:label="@ssortingng/app_name" android:theme="@style/AppTheme" android:icon="@drawable/app_icon" > 

Vous devriez maintenant pouvoir utiliser ApplicationContextSingleton.getInstance (). GetApplicationContext (). GetResources () à partir de n’importe quel endroit, également les très rares endroits où les sous-classes d’applications ne peuvent pas.

S’il vous plaît laissez-moi savoir si vous voyez quelque chose de mal ici, merci. 🙂

Il y a aussi une autre possibilité. Je charge les shaders OpenGl à partir de ressources comme celle-ci:

 static private Ssortingng vertexShaderCode; static private Ssortingng fragmentShaderCode; static { vertexShaderCode = readResourceAsSsortingng("/res/raw/vertex_shader.glsl"); fragmentShaderCode = readResourceAsSsortingng("/res/raw/fragment_shader.glsl"); } private static Ssortingng readResourceAsSsortingng(Ssortingng path) { Exception innerException; Class< ? extends FloorPlanRenderer> aClass = FloorPlanRenderer.class; InputStream inputStream = aClass.getResourceAsStream(path); byte[] bytes; try { bytes = new byte[inputStream.available()]; inputStream.read(bytes); return new Ssortingng(bytes); } catch (IOException e) { e.printStackTrace(); innerException = e; } throw new RuntimeException("Cannot load shader code from resources.", innerException); } 

Comme vous pouvez le voir, vous pouvez accéder à n’importe quelle ressource dans path /res/... Modifiez une aClass dans votre classe. Cela aussi comment je charge des ressources dans les tests (androidTests)

Une autre solution:

Si vous avez une sous-classe statique dans une classe externe non statique, vous pouvez accéder aux ressources de la sous-classe via des variables statiques dans la classe externe, que vous initialisez lors de la création de la classe externe. Comme

 public class Outerclass { static Ssortingng resource1 public onCreate() { resource1 = getSsortingng(R.ssortingng.text); } public static class Innerclass { public SsortingngGetter (int num) { return resource1; } } } 

Je l’ai utilisé pour la fonction getPageTitle (int position) de FragmentPagerAdapter statique dans mon FragmentActivity, ce qui est utile à cause de I8N.

Je pense que plus de moyen est possible. Mais parfois, j’utilise cette solution. (global complet):

  import android.content.Context; import .R; public class XmlVar { private XmlVar() { } private static Ssortingng _write_success; public static Ssortingng write_success() { return _write_success; } public static void Init(Context c) { _write_success = c.getResources().getSsortingng(R.ssortingng.write_success); } } //After activity created: cont = this.getApplicationContext(); XmlVar.Init(cont); //And use everywhere XmlVar.write_success(); 

Dans votre classe, où vous implémentez la fonction statique , vous pouvez appeler une méthode private \ public à partir de cette classe. La méthode private \ public peut accéder aux getResources .

par exemple:

 public class Text { public static void setColor(EditText et) { et.resetColor(); // it works // ERROR et.setTextColor(getResources().getColor(R.color.Black)); // ERROR } // set the color to be black when reset private void resetColor() { setTextColor(getResources().getColor(R.color.Black)); } } 

et à partir d’une autre classe \ activity, vous pouvez appeler:

 Text.setColor('some EditText you initialized'); 

si vous avez un contexte, je veux dire à l’intérieur;

 public void onReceive(Context context, Intent intent){ } 

vous pouvez utiliser ce code pour obtenir des ressources:

 context.getResources().getSsortingng(R.ssortingng.app_name); 

J’aime les raccourcis.

J’utilise App.getRes() au lieu de App.getContext().getResources() (comme @Cristian a répondu)

Quelle? Il est très simple d’utiliser n’importe où dans votre application!

Voici donc une solution unique par laquelle vous pouvez accéder aux ressources de n’importe où, comme la Util class .

(1) Créez ou modifiez votre classe d’ Application .

 import android.app.Application; import android.content.res.Resources; public class App extends Application { private static App mInstance; private static Resources res; @Override public void onCreate() { super.onCreate(); mInstance = this; res = getResources(); } public static App getInstance() { return mInstance; } public static Resources getResourses() { return res; } } 

(2) Ajoutez un champ de nom à votre tag manifest.xml . (ou sautez ceci si déjà là)

  ...  

Maintenant, vous êtes prêt à partir. Utilisez App.getRes().getSsortingng(R.ssortingng.some_id) n'importe où dans l'application.

Je charge shader pour openGL ES à partir de la fonction statique.

Rappelez-vous que vous devez utiliser des minuscules pour votre nom de fichier et de répertoire, sinon l’opération échouera

 public class MyGLRenderer implements GLSurfaceView.Renderer { ... public static int loadShader() { // Read file as input stream InputStream inputStream = MyGLRenderer.class.getResourceAsStream("/res/raw/vertex_shader.txt"); // Convert input stream to ssortingng Scanner s = new Scanner(inputStream).useDelimiter("\\A"); Ssortingng shaderCode = s.hasNext() ? s.next() : ""; } ... }