¿Acceso estático a los recursos de una aplicación para Android?
Tengo un problema. Los recursos de una aplicación de Android:
Mi aplicación tiene misc. Modos (edit / plan / exec), que me gustaría describir usando un tipo de enumeración. Sin embargo, quisiera poblar los valores de enumeración con cadenas que provienen del archivo resource string.xml, es decir, en lugar de
- Seleccionar texto para copiar Android EditText
- Android Widget cambia programaticamente la configuración de remoteView
- Permiso del proveedor de contenido al acceder a través de android.widget.RemoteViewsService
- Biblioteca de vista o fragmento para componer la interfaz de usuario para tipos de datos comunes
- Widget de la pantalla de inicio de Android (icono, etiqueta - estilo)
enum Mode { EDIT ("edit"), PLAN ("plan"), EXEC ("exec"); String name; Mode(String name) { this.name = name; } @Override public String toString() { return this.name; } };
Me gustaría escribir algo como:
enum Mode { EDIT (getResources().getText(R.string.mode_edit).toString()), PLAN (getResources().getText(R.string.mode_plan).toString())), EXEC (getResources().getText(R.string.mode_exec).toString())); String name; Mode(String name) { this.name = name; } @Override public String toString() { return this.name; } }
Que permitiría, por ejemplo, modificar los nombres de los modos utilizando el archivo de recursos y permitir así modificaciones de nombres posteriores sin cambios de código, internacionalización, etc.
El problema es que el acceso estándar a los recursos es a través del método getResources () de una actividad que sólo está disponible en el constructor (y durante los métodos de instancia). Sin embargo, la declaración de enumeración forma parte del código de inicialización estática de una clase. ¿Hay alguna manera de acceder a los recursos de una aplicación de una manera estática?
Miguel
- No se llama al método WebView: WebViewClient.onPageStarted
- Android Appcompat v21 - utilizar el estilo antiguo del hilandero
- Arregle dinámicamente los botones alrededor de un círculo
- Crear widget en la instalación de la aplicación
- Cómo establecer el color de borde para EditText para error de validación
- ¿Cómo controlar el ancho y la altura del cuadro de diálogo de alertas predeterminado en Android?
- Permitir al usuario insertar una imagen en la aplicación android
- ¿Cómo implementar un evento Swipe para ver Flipper en un ViewPager?
enum Mode { EDIT (R.string.mode_edit), PLAN (R.string.mode_plan), EXEC (R.string.mode_exec); String id; Mode(String id) { this.id = id; } public String getName(Resources r){ return r.getText(id); } @Override public String toString() { return this.name; } }
Alternativamente, puede hacer lo siguiente:
public class ClassName { public static Resources res; }
En su Application.onCreate()
o Activity.onCreate()
:
ClassName.res = getResources();
Y en su enum Mode
:
@Override public String toString() { Resources res = ClassName.res; if (res==null){ return super.toString(); } else { return res.getText(id); } }
Gracias, radek-k, por los ejemplos! Mientras tanto, me propuse una idea algo similar, es decir, añadí un método estático al enum al que luego pasaba el manejador de recursos durante el método onCreate () de la Actividad. Esto permite que el método toString () – acceda a las cadenas de recursos. IMHO no muy elegante, pero funciona …
Saludos, Michael
Basado en esta https://stackoverflow.com/a/3560656/262462 y porque R.string contiene números enteros
enum Mode { EDIT (R.string.mode_edit), PLAN (R.string.mode_plan), EXEC (R.string.mode_exec); int id; Mode(int id) { this.id = id; } public String toString(Resources r) { return r.getString(id); } }
- Android – Por qué ConnectivityManager.isActiveNetworkMetered siempre devuelve true (incluso en Wifi)
- Compartir un objeto entre actividades