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!
- Autogeneración de Android TAG de registro en Android Studio / Intellij idea
- Cómo escribir una base de datos en un archivo de texto en android
- AVD no se está ejecutando
- Diferencias entre varios tipos de bool?
- ¿Es posible usar VectorDrawable en Botones y TextViews usando android: DrawableRight?
Edit: ¿Podemos acceder a los recursos sin utilizar Context
?
- Android Studio: El cursor de texto desaparece / desapareció después de abrir alguna otra clase o pegar texto en diferentes clases
- Inserción de valores en Mapa <K, V>
- Gestionar devoluciones de llamada en el cliente android de Socket.io v1.4
- Excepción al usar ksoap2-android
- Esperaba un mapa mientras se deserializaba, pero obtuvo una clase java.lang.Long
- Fechas horarias de la fecha de Android driving me nuts
- El constructor AdRequest () no es visible
- Java MappedByteBuffer.get () sorprendentemente lento
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.