¿Cómo puedo obtener un contenido de recursos de un contexto estático?

Quiero leer cadenas de un archivo xml antes de hacer cualquier otra cosa como setText en widgets, entonces, ¿cómo puedo hacer eso sin un objeto de actividad para llamar a getResources() ?

  1. Cree una subclase de Application , por ejemplo Application de Application de public class App extends Application {
  2. Establezca el atributo android:name de su etiqueta en AndroidManifest.xml para que apunte a su nueva clase, por ejemplo, android:name=".App"
  3. En el método onCreate() de la instancia de su aplicación, guarde su contexto (por ejemplo, this ) en un campo estático llamado mContext y cree un método estático que devuelva este campo, por ejemplo, getContext() :

Así es como debería verse:

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

Ahora puede usar: App.getContext() siempre que quiera obtener un contexto, y luego getResources() (o App.getContext().getResources() ).

Utilizar

 Resources.getSystem().getString(android.R.string.cancel) 

¡Puedes usarlos en todas partes en tu aplicación, incluso en declaraciones constantes estáticas! ¡Pero solo para recursos del sistema!

The 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; } } 

Inicialice Singleton en su subclase de 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 no estoy equivocado, esto le da un gancho a applicationContext en todas partes, llámalo con ApplicationContextSingleton.getInstance.getApplicationContext(); No debería necesitar aclarar esto en ningún momento, ya que cuando se cierra la aplicación, esto conlleva de todos modos.

Recuerde actualizar AndroidManifest.xml para usar esta subclase de la Application :

    android:label="@string/app_name" android:theme="@style/AppTheme" android:icon="@drawable/app_icon" > 

Ahora debería poder usar ApplicationContextSingleton.getInstance (). GetApplicationContext (). GetResources () desde cualquier lugar, también los pocos lugares donde las subclases de aplicaciones no pueden.

Por favor, avíseme si ve algo mal aquí, gracias. 🙂

También hay otra posibilidad. Puedo cargar sombreadores OpenGl de recursos como este:

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

Como puede ver, puede acceder a cualquier recurso en ruta /res/... Cambiar una clase a su clase. También es así como cargo los recursos en las pruebas (androidTests)

Otra solución:

Si tiene una subclase estática en una clase externa no estática, puede acceder a los recursos desde dentro de la subclase a través de variables estáticas en la clase externa, que iniciará en la creación de la clase externa. Me gusta

 public class Outerclass { static String resource1 public onCreate() { resource1 = getString(R.string.text); } public static class Innerclass { public StringGetter (int num) { return resource1; } } } 

Lo usé para la función getPageTitle (int position) del FragmentPagerAdapter estático dentro de mi FragmentActivity que es útil debido a I8N.

Creo que más camino es posible. Pero a veces, estoy usando esta solución. (completo global):

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

En su clase, donde implementa la función estática , puede llamar a un método privado \ público de esta clase. El método private \ public puede acceder a getResources .

por ejemplo:

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

y de otra clase \ actividad, puede llamar:

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

si tienes un contexto, quiero decir adentro;

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

puedes usar este código para obtener recursos:

 context.getResources().getString(R.string.app_name); 

Me gustan los atajos.

Uso App.getRes() lugar de App.getContext().getResources() (como @Cristian respondió)

¿Qué? ¡Es muy simple de usar en cualquier lugar de tu aplicación!

Así que aquí hay una solución única mediante la cual puede acceder a recursos desde cualquier lugar, como la Util class .

(1) Cree o edite su clase de 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) Agregue un campo de nombre a su manifest.xml etiqueta de la . (u Omita esto si ya está allí)

  ...  

Ahora eres bueno para ir. Utilice App.getRes().getString(R.string.some_id) en cualquier lugar de la aplicación.

Cargué shader para OpenGL ES desde la función estática.

Recuerde que debe utilizar minúsculas para su nombre de archivo y directorio, de lo contrario, la operación fallará.

 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 string Scanner s = new Scanner(inputStream).useDelimiter("\\A"); String shaderCode = s.hasNext() ? s.next() : ""; } ... }