2010-09-29 21 views
22

Al programar para Android a veces tiene que usar métodos estáticos. Pero cuando intenta acceder a sus recursos en un método estático con getString(R.string.text), obtendrá un error. Hacerlo estático no funciona.Android: getString (R.string) en el método estático

¿Alguien sabe una buena forma de evitar esto? Los archivos de recursos en Android son muy útiles para crear cosas en diferentes idiomas o hacer cambios en un texto.

Respuesta

24

De una forma u otra, necesitará un contexto para eso ... Para los métodos estáticos, esto probablemente signifique que debe pasar un Contexto al llamarlos.

6

Pase en una instancia Context (es decir, Activity) como un objeto de parámetro para el método estático. Luego invoque getString en el parámetro.

+0

Esto puede ser una mala idea. Si está almacenando referencias a contextos, podría causar una pérdida de memoria – Falmarri

+6

¿Qué le hizo pensar que sugiero almacenar una referencia de contexto? –

+0

@Falmarri: siempre puede usar 'getApplicationContext()', que luego validaría toda la vida útil de la aplicación –

14

Usted podría utilizar Resources.getSystem().getStringArray(android.R.array.done);

+2

Esta es una buena solución, solo que la desventaja es que solo puede usar los recursos del sistema. –

+1

@ serv-inc: eso no es lo que dice 'Resources.getSystem()' [documentation] (https://developer.android.com/reference/android/content/res/Resources.html#getSystem()). – aroth

+1

@ serv-inc: me refiero a que, de acuerdo con la documentación de referencia de Google, no importa si 'importa su paquete.R; 'cuando se usa' Resources.getSystem(). GetStringArray() ', porque' Resources.getSystem() 'devuelve" un objeto de recursos compartidos global ** que proporciona acceso solo a los recursos del sistema ** ". Lo que sugiere fuertemente que @SarenInden es correcto y que el comentario de seguimiento solo enviará a las personas por el camino equivocado al sugerir que intenten algo que la documentación oficial explícitamente dice que no funcionará. – aroth

-2

Una forma es que se puede pasar a su contexto método estático. mira esto definitivamente las obras

Sonidos clase pública {

public static MediaPlayer getSoundTouch(Context context){ 
    return MediaPlayer.create(context, R.raw.touch); 

} 

public static MediaPlayer getSoundLeak(Context context){ 
    return MediaPlayer.create(context, R.raw.leak); 

} 

public static MediaPlayer getSoundFinish(Context context){ 
    return MediaPlayer.create(context, R.raw.finish); 

} 

}

2

Así es como puedo acceder a los recursos desde el interior de los métodos estáticos. Tal vez no es ideal, pero.

En primer lugar, extiendo aplicación y establecer algún campo static (s), y crear un método para inicializar ellos:

public class MyApp extends Application { 

    // static resources 
    public static String APP_NAME; 

    public static void initResources(Context context) { 
    APP_NAME = context.getResources().getString(R.string.app_name); 
    } 
} 

Y en mi manifiesto que registrar la aplicación extendida:

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

En mi actividad de arranque (MainActivity), hago una llamada para inicializar los recursos estáticos:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    MyApp.initResources(this); 
} 
Entonces

en cualquier lugar de su proyecto, después de MainActivity.onCreate (Bundle b) ha de ejecución, puede llamar a métodos estáticos que tienen acceso a sus recursos estáticos especificados:

public static void printAppName() { 
    Log.w("tag", "my app name: " + MyApp.APP_NAME); 
} 
Cuestiones relacionadas