He encontrado la R.string bastante impresionante para mantener codificado cuerdas de mi código, y me gustaría seguir utilizando en una clase de utilidad que trabaja con modelos en mi aplicación para generar la salida. Por ejemplo, en este caso estoy generando un correo electrónico de un modelo fuera de la actividad.

Es posible el uso de getString fuera un Context o Activity? Supongo que me podría pasar en la actividad actual, pero parece innecesario. Por favor me corrija si estoy equivocado!

Edición: Podemos acceder a los recursos sin utilizando Context?

  • Pasando el contexto de la clase a la que se va a utilizar la cadena, que también están pasando información acerca de qué idioma (en, es, etc) está siendo utilizado por la aplicación. Así que si usted tiene dos strings.xml, va a saber cual usar
InformationsquelleAutor SapphireSun | 2010-11-23

11 Comentarios

  1. 394

    Sí, podemos tener acceso a los recursos sin el uso de `Contexto`

    Puede utilizar:

    Resources.getSystem().getString(android.R.string.somecommonstuff)

    … en todas partes en su aplicación, incluso en las constantes estáticas de declaraciones.
    Por desgracia, es compatible con el sistema de recursos sólo.

    Para locales de uso de los recursos esta solución. No es trivial, pero funciona.

    • ¿qué se entiende por recursos del sistema? el strings.xml es el sistema de recursos o no? Para mí no funciona, dice que no se puede encontrar recursos.
    • El sistema de recursos pertenecen a Android en el dispositivo. strings.xml pertenecen a su aplicación sólo. Buscar stackoverflow.com/a/4391811/715269 solución
    • Esta es una solución elegante para esas clases de Fábrica cuando se accede a las cadenas. No me gusta pasar a lo largo de Contexto en todas partes. Eso es solo un desorden innecesario para los casos en los que en realidad sólo quieren una cadena almacenada a nivel mundial.
    • gracias por permitirme, para no dejar programación en android cuando estamos acostumbrados a de clases Auxiliares
    • esto es más effiecient que pasan el contexto de una clase y el uso de ella ??
    • Exactamente, ¿de qué estás hablando? Menciono dos maneras – por los recursos del sistema y para los usuarios de los recursos. Si la primera sin duda, es el más eficiente. Si te refieres a la segunda tiene la misma eficacia, pero mucho es mucho más conveniente si usted está haciendo algo más serio que una tarea escolar. La razón principal es que en cualquier cambio en la organización de recursos que tienen menos lugares para ver.
    • Y cómo quieres pasar el contenido a diferentes clases? El principal problema que estamos hablando, es que tenemos estos recursos demasiado tarde. Qué objeto desea pasar por ellos? Una de las clases? Entonces, ¿cuál es el uso de su solución?
    • me sale este error android.content.res.Resources$NotFoundException: String resource ID #0x7f0f0061
    • Así que, este recurso no está en la lista de recursos comunes. Si esto no ayuda, haga su pregunta como una pregunta, con ejemplos y ser más exacto.

  2. 106

    Por desgracia, la única manera que usted puede tener acceso a cualquiera de los recursos de cadena es con un Context (es decir, un Activity o Service). Lo que ha hecho en este caso, es que simplemente requiere que la persona que llama a pasar en el contexto.

    • Gracias por la sugerencia! He intentado esto, pero por alguna razón tengo un error de compilación cuando traté de: ctx.getString(ctx.R.string.blah);
    • Me gustaría hacer que el argumento de la util métodos de tipo Context de modo que usted puede utilizar de una Actividad o un Servicio.
    • Usted no necesita la ctx.R.string.blah, sólo tiene que utilizar R.string.blah
    • Me dio un símbolo no se encuentra el error para R. string.bla porque la clase no es un contexto. 🙁
    • Supongo que me podría pasar en la R, pero que parece muy anticuado.
    • No estoy seguro de donde la symbol not found error viene, pero asegúrese de que usted tiene R importados en la parte superior de la clase.
    • Je, yo era conseguir que el símbolo no se encuentra el error porque yo estaba usando import basepackage.* para todas mis otras clases y me olvidé de hacerlo en este caso.
    • La respuesta es FALSA. Con el siguiente. 🙂
    • Esta respuesta es falsa, actualizar, por favor. O al menos cambiar la primera línea de la respuesta – «por Desgracia, la única manera que usted puede tener acceso a cualquiera de los recursos de cadena es con un Contexto’- ver @Gangnus ‘s respuesta.

  3. 31

    En MyApplication, que se extiende Application:

    public static Resources resources;

    En MyApplication‘s onCreate:

    resources = getResources();

    Ahora usted puede utilizar este campo desde cualquier lugar de su aplicación.

    • Funciona a través del servicio? (Especialmente cuando Android mata app y empieza a solo servicio)
    • Sí, Android comienza a ejecutar el código de la Aplicación de llamada.onCreate y después de que se ejecuta el servicio.
  4. 22

    Por CIERTO, una de las razones de símbolo no se encuentra error puede ser que tu IDE importados android.R; de la clase en lugar de la suya uno. Acaba de cambiar import android.R; a importar su.espacio de nombres.R;

    Para 2 cosas básicas para la cadena visible en las diferentes clase:

    //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);
    }
  5. 14

    Enfoque Único

    App.getRes().getString(R.string.some_id)

    Esto va a funcionar en todas partes en la aplicación. (Util de clase, de Diálogo, Fragmento o
    cualquier clase en su aplicación
    )

    (1) Crear o Editar (si existe) de su Application clase.

    import android.app.Application;
    import android.content.res.Resources;
    
    public class App extends Application {
        private static App mInstance;
        private static Resources res;
    
    
        @Override
        public void onCreate() {
            super.onCreate();
            mInstance = this;
            res = getResources();
        }
    
        public static App getInstance() {
            return mInstance;
        }
    
        public static Resources getResourses() {
            return res;
        }
    
    }

    (2) Agregue el campo nombre de su manifest.xml <application etiqueta.

    <application
            android:name=".App"
            ...
            >
            ...
        </application>

    Ahora que son buenos para ir. Uso App.getRes().getString(R.string.some_id) en cualquier lugar de la aplicación.

    • Personalmente, me gusta este enfoque. Conveniente para llegar cadena personalizada a los recursos desde cualquier lugar en el código.
    • Hay problemas de seguridad con esta solución?
    • No, no creo.
    • La solución perfecta
  6. 4

    Si usted tiene una clase que se utiliza en una actividad y quieres tener acceso a los recursos en esa clase, te recomiendo que para definir un contexto como una variable privada en la clase inicial y en el 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 una instantánea de la clase en su actividad:

    MyClass m=new MyClass(this);
  7. 0

    Este debe obtener acceso a applicationContext desde cualquier lugar, lo que le permite obtener applicationContext en cualquier lugar que puede utilizar; 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;
        }
    
    }

    Inicializar el Singleton en su Application subclase:

    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 de applicationContext en todas partes, llame a con ApplicationContextSingleton.getInstance.getApplicationContext();
    Usted no debe necesitar para borrar en cualquier momento, como cuando la aplicación se cierra, esto va con él de todos modos.

    Recuerde que la actualización de AndroidManifest.xml para utilizar este Application subclase:

    <?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. 🙂

  8. 0

    El mejor enfoque a partir de la respuesta de Khemraj:

    Clase App

    class App : Application() {
    
        companion object {
            lateinit var instance: Application
            lateinit var resourses: Resources
        }
    
    
        //MARK: - Lifecycle
    
        override fun onCreate() {
            super.onCreate()
            instance = this
            resourses = resources
        }
    
    }

    Declaración en el manifiesto

    <application
            android:name=".App"
            ...>
    </application>     

    Constantes de la clase

    class Localizations {
    
        companion object {
            val info = App.resourses.getString(R.string.info)
        }
    
    }

    Utilizando

    textView.text = Localizations.info
  9. -2

    Esto es lo que hice,
    En su MainActivity, crear una variable estática para el contexto, como se muestra a continuación:

    public static Context mContext;

    y en el onCreate() inicializar mContext a este;

    mContext = this;

    A continuación, en el archivo donde se desea acceder contexto, digamos,

    private Context context = MainActivity.mContext;

    Ahora, usted puede obtener un recurso de cadena de la siguiente manera,

    String myString = context.getResources().getString(R.string.resource_id);
  10. -8

    He utilizado
    getContext().getApplicationContext().getString(R.string.nameOfString);
    A mí me funciona.

    • ¿Crees que getContext() está disponible en todas partes?!
    • Esto no proporciona una respuesta a la pregunta porque getContext() sólo disponible en actividades y fragmentos de clases

Dejar respuesta

Please enter your comment!
Please enter your name here