He encontrado lo R.string
increíble para mantener las cadenas codificadas fuera de mi código, y me gustaría seguir usándolo en una clase de utilidad que funciona con modelos en mi aplicación para generar resultados. Por ejemplo, en este caso estoy generando un correo electrónico desde un modelo fuera de la actividad.
¿Es posible usar getString
fuera de un Context
oActivity
? Supongo que podría pasar la actividad actual, pero parece innecesario. ¡Por favor corrígeme si estoy equivocado!
Editar: ¿Podemos acceder a los recursos sin usar Context
?
java
android
string
android-resources
android-context
ZafiroSun
fuente
fuente
Respuestas:
Sí, podemos acceder a los recursos sin usar `Context`
Puedes usar:
... en todas partes en su aplicación, incluso en declaraciones de constantes estáticas. Desafortunadamente, solo admite los recursos del sistema .
Para recursos locales, use esta solución . No es trivial, pero funciona.
fuente
android.content.res.Resources$NotFoundException: String resource ID #0x7f0f0061
Desafortunadamente, la única forma en que puede acceder a cualquiera de los recursos de cadena es con un
Context
(es decir, unActivity
oService
). Lo que generalmente he hecho en este caso es simplemente requerir que la persona que llama pase en el contexto.fuente
ctx.getString(ctx.R.string.blah);
Context
para que pueda usarlo desde una Actividad o un Servicio.ctx.R.string.blah
, solo useR.string.blah
symbol not found error
viene, pero asegúrese de que hayaR
importado en la parte superior de la clase.En
MyApplication
, que se extiendeApplication
:En
MyApplication
sonCreate
:Ahora puede usar este campo desde cualquier lugar de su aplicación.
fuente
Por cierto, una de las razones del error de símbolo no encontrado puede ser que su IDE importó android.R; clase en lugar de la tuya. Simplemente cambie import android.R; para importar your.namespace.R;
Entonces, 2 cosas básicas para hacer que la cadena sea visible en la clase diferente:
fuente
Enfoque único
App.getRes().getString(R.string.some_id)
(1) Cree o edite (si ya existe) su
Application
clase.(2) Agregue el campo de nombre a su
manifest.xml
<application
etiqueta.Ahora estás listo para irte. Úselo
App.getRes().getString(R.string.some_id)
en cualquier lugar de la aplicación.fuente
Si tiene una clase que usa 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 y lo inicialice en el constructor:
Hacer un instante de clase en tu actividad:
fuente
Esto debería
applicationContext
permitirle acceder desde cualquier lugar, permitiéndole llegar aapplicationContext
cualquier lugar que pueda usarlo;Toast
,getString()
,sharedPreferences
, Etc.El singleton:
Inicialice el Singleton en su
Application
subclase:Si no me equivoco, esto le da un gancho a applicationContext en todas partes,
ApplicationContextSingleton.getInstance.getApplicationContext();
llámelo con No debería tener que borrar esto en ningún momento, ya que cuando la aplicación se cierra, esto va con ella de todos modos.Recuerde actualizar
AndroidManifest.xml
para usar estaApplication
subclase:Avísame si ves algo mal aquí, gracias. :)
fuente
El mejor enfoque de la respuesta de Khemraj:
Clase de aplicación
Declaración en el manifiesto
Clase de constantes
Utilizando
fuente
Es mejor usar algo como esto sin contexto y actividad :
fuente
De alguna manera no me gustaron las soluciones hacky de almacenar valores estáticos, así que se me ocurrió un poco más, pero una versión limpia que también se puede probar.
Encontramos 2 formas posibles de hacerlo
p.ej
Antes de leer: Esta versión usa
Data binding
XML-
Actividad / Fragmento
A veces, debe cambiar el texto en función de un campo en un modelo. Por lo tanto, también vincularía ese modelo con datos y, dado que su actividad / fragmento conoce el modelo, puede recuperar el valor y luego vincular la cadena con los datos en función de eso.
fuente
Puede hacer esto en Kotlin creando una clase que extienda la aplicación y luego use su contexto para llamar a los recursos en cualquier parte de su código
Tu clase de aplicación se verá así
Declare su clase de aplicación en AndroidManifest.xml (muy importante)
Para acceder, por ejemplo, a un archivo de cadena, use el siguiente código
fuente
Esto es lo que hice, en su actividad principal, crear una variable estática para el contexto como se muestra a continuación:
y en onCreate () inicialice mContext a esto;
Luego, en el archivo donde desea acceder al contexto, diga:
Ahora, puede obtener un recurso de cadena de la siguiente manera,
fuente
Solía
getContext().getApplicationContext().getString(R.string.nameOfString);
funcionar para mí.fuente
getContext()
está disponible en todas partes?