He encontrado lo R.stringincreí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 getStringfuera de un ContextoActivity ? 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 #0x7f0f0061Desafortunadamente, la única forma en que puede acceder a cualquiera de los recursos de cadena es con un
Context(es decir, unActivityoService). 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);Contextpara que pueda usarlo desde una Actividad o un Servicio.ctx.R.string.blah, solo useR.string.blahsymbol not found errorviene, pero asegúrese de que hayaRimportado en la parte superior de la clase.En
MyApplication, que se extiendeApplication:En
MyApplicationsonCreate: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
Applicationclase.(2) Agregue el campo de nombre a su
manifest.xml<applicationetiqueta.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
applicationContextpermitirle acceder desde cualquier lugar, permitiéndole llegar aapplicationContextcualquier lugar que pueda usarlo;Toast,getString(),sharedPreferences, Etc.El singleton:
Inicialice el Singleton en su
Applicationsubclase: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.xmlpara usar estaApplicationsubclase: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 bindingXML-
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?