2011-04-07 16 views
17

Estoy tratando de poner la configuración, como URL/etc, en una carpeta de recursos para que una clase de utilidad la use. Sin embargo, no quiero pasar el Contexto de las actividades a todas partes. Me gustaría poder acceder a un recurso a través de un nombre de ruta (parece que assets/fue diseñado para este uso), sin usar un contexto para acceder al recurso.Acceso a recursos sin contexto

En este caso particular, quiero que un singleton use algo en la configuración cuando se crea una instancia. No necesita nada de recursos además de ese único momento durante la creación de instancias. Por lo tanto, tener que pasar en un Contexto cada vez que se llama getInstance() sería un desperdicio completo.

Además, esto es específico de la configuración de la aplicación y no debe almacenarse en un archivo de sistema compartido ni nada de eso.

Respuesta

61

Uso

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

Se puede utilizar absolutamente por todas partes en su aplicación, incluso en la declaración constantes estática! Pero solo para recursos del sistema.

Para recursos locales use that solution.

+21

** Pero solo para recursos del sistema. ** – Youngjae

+0

@Youngjae sí. Y para los locales siga la referencia. – Gangnus

+0

Recibí una excepción: android.content.res.Resources $ NotFoundException: String resource ID – vinidog

1

Lamentablemente, no creo que haya una forma real de evitar esto. Extiendo el mío algo así, y también paso el getApplicationContext() en lugar del contexto de la actividad.

public static AppController getAppController(Context context){ 
    if(self == null) { 
     //Create instance 
     self = new AppController(); 
    } 

    return self; 
} 

Y luego:

appController = AppController.getAppController(getApplicationContext()); 
+0

Ohh bien, temía que iba a ser la respuesta. Parece un diseño bastante malo para poder acceder a los recursos de la aplicación solo desde contextos. Estoy seguro de que hay razones para ello ... pero no deja de ser molesto. Gracias por confirmarlo =) – mnemy

+0

Mi equipo y yo nos quejamos todo el tiempo. Hace difícil escribir código modular desacoplado. – sgarman

1

Yo recomendaría hacer lo siguiente: En lugar de pasar el contexto de todo el mundo que su clase de actividad de una clase Singleton con una función pública que devuelve el contexto:

private static ActivityMain instance; 

Inicializar el interior onCreate() antes de super.onCreate ():

instance = this; 

a continuación, añadir estas funciones públicas de su actividad:

/** Get singleton instance of activity **/ 
public static ActivityMain getInstance() { 
    return instance; 
} 

/** Returns context of this activity **/ 
public static Context getContext(){ 
    return instance.getApplicationContext(); 
} 

Ahora puede utilizar el siguiente en cualquier lugar en cualquier clase:

Context context = AntiMorphActivity.getContext(); 
String packageName = context.getPackageName(); 
int id = context.getResources().getIdentifier("web_page", "raw", packageName); 
+0

Solución extremadamente terrible. Estás filtrando tu actividad de esta manera. –

+2

No, él está usando el contexto de la aplicación, por lo tanto, la actividad no se ha filtrado. – Davor

9

Usted podría extender la clase principal de la aplicación y proporcionar ayudantes universales allí para acceder a los recursos. Esto alivia la necesidad de contexto ya que la aplicación proporcionaría el contexto en lugar de la persona que llama. La clase de aplicación es de estilo único y siempre debe estar disponible mientras se ejecuta una parte de la aplicación (incluidos los servicios).

public class MyApplication extends Application { 
protected static MyApplication instance; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    instance = this; 
} 

public static Resources getResources() { 
    return instance.getResources(); 
} 
} 

Esto proporciona acceso a:

MyApplication.getResources().... 

Asegúrese de declarar su aplicación personalizada en su manifiesto para tener acceso a este.Asumiendo que su aplicación personalizada se encuentra en la raíz del espacio de nombres de la aplicación:

<application 
android:name=".MyApplication" 
... > 
+0

¿Hay algún inconveniente potencial al usar esto? –

Cuestiones relacionadas