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.

  • Firewall de Android con VpnService
  • Cómo obtener eventos de google cuenta calendario en android?
  • Creación de un registro WiFi NDEF utilizando application / vnd.wfa.wsc en Android
  • Android: Dialog Builder multipleselection arreglo matriz
  • API de hotspot wifi de Android 2.2
  • No se puede conectar al servidor Openfire (mediante smack api)
  • Actualización de Eclipse con herramientas de desarrollo de Android v. 23
  • ¿Cómo obtener el nombre del modelo de la CPU de Android?
  • Cómo llamar a getWindow () fuera de una actividad en Android?
  • Verificando servidores Verisign certificates throws No es una excepción de certificado de servidor de confianza
  • Centro de mensajes en el cuadro de diálogo de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.