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.

  • Mediación de Admob - ID de editor y ID de mediación
  • Aplicación de tiempo de uso de seguimiento de Android android en Android
  • Puntero nulo en la vista inflada al cargar por segunda vez un fragmento de mapa de google
  • Eclipse: inhabilita la compilación de archivos XML mientras está en perspectiva de Java
  • ¿Por qué estoy obteniendo una referencia nula en mi RecyclerView
  • Android Propósito de enviar correo electrónico con adjunto
  • Cómo convertir HTML <tabla> en un arreglo 2D
  • ¿Cuál es la mejor manera de comprobar si una cadena contiene una URL en Java / Android?
  • Obtener coordenadas de botones y detectar si el dedo está sobre ellos - Android
  • NullPointerException en getActivity (). RunOnUiThread (nuevo Runnable () {
  • Extraer el archivo AndroidManifest.xml de apk usando sólo Java
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.