GetString fuera de un contexto o actividad

He encontrado el R.string bastante impresionante para mantener cadenas codificadas de mi código, y me gustaría seguir utilizando en una clase de utilidad que funciona con los modelos de mi aplicación para generar salida. Por ejemplo, en este caso estoy generando un correo electrónico de un modelo fuera de la actividad.

¿Es posible usar getString fuera de un Context o Activity ? Supongo que podría pasar en la actividad actual, pero parece innecesario. Por favor, corrija si estoy equivocado!

Edit: ¿Podemos acceder a los recursos sin utilizar Context ?

Sí, podemos acceder a los recursos sin utilizar `Contexto`

Puedes usar:

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

… en todas partes en su aplicación, incluso en declaraciones de constantes estáticas. Desafortunadamente, sólo admite los recursos del sistema .

Para los recursos locales, utilice esta solución . No es trivial, pero funciona.

Desafortunadamente, la única manera de acceder a cualquiera de los recursos de cadena es con un Context (es decir, una Activity o Service ). Lo que normalmente he hecho en este caso, es simplemente requerir que el llamador pase en el contexto.

En MyApplication, que extiende Application :

 public static Resources resources; 

En la publicación de MyApplication:

 resources = getResources(); 

Ta-da !!!! Ahora puede utilizar este campo desde cualquier lugar de su aplicación.

BTW, uno de los motivos de error símbolo no encontrado puede ser que su IDE importado android.R; Clase en lugar de la suya. Simplemente cambie la importación android.R; Para importar your.namespace.R;

Así que 2 cosas básicas para obtener la cadena visible en la clase diferente:

 //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 tiene una clase que utiliza en una actividad y desea tener acceso al recurso en esa clase, le recomiendo que defina un contexto como una variable privada en la clase e inícielo en constructor:

 public class MyClass (){ private Context context; public MyClass(Context context){ this.context=context; } public testResource(){ String s=context.getString(R.string.testString).toString(); } } 

Hacer un instante de clase en su actividad:

 MyClass m=new MyClass(this); 

Esto debería tener acceso a applicationContext desde cualquier lugar que le permita obtener applicationContext cualquier lugar que pueda utilizarlo; Toast , getString() , sharedPreferences , etc.

El 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 el 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ámelo con ApplicationContextSingleton.getInstance.getApplicationContext(); No deberías borrar esto en ningún momento, como cuando la aplicación se cierra, esto va con él de todos modos.

Recuerde actualizar AndroidManifest.xml para usar esta subclase de 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" > 

Por favor, hágamelo saber si usted ve algo mal aquí, gracias. 🙂

Utilicé getContext().getApplicationContext().getString(R.string.nameOfString); Esto funciona para mi.

  • No se puede verificar la llamada de método de simulación desde el suscriptor de RxJava
  • Java.lang.NoClassDefFoundError: android.support.v4.content.LocalBroadcastManager aplicación facebook android
  • IntelliJ / Android Studio: eliminar el uso innecesario de 'esto.'
  • Conjunto de subprocesos en Java
  • grupo de radio setOnCheckedChangeListener
  • Nullpointerexception en dispatchDraw con ViewPager en fragmento anidado con PageTransformer
  • Mapbox infla la vista en el fragmento
  • ¿Cómo funcionan los anuncios en los teléfonos móviles?
  • Android Audio - Transmisión de generador de seno-tono comportamiento extraño
  • Android - Definición dinámica de la intención Extras
  • Cómo configurar Proguard para mantener los métodos estáticos con diferentes tiempos de retorno
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.