Cambiar el valor de R.string mediante progtwigción

He declarado una cadena en mi archivo strings.xml y lo uso en mi actividad como R.string.compose_title. (configurándolo como título, es decir, setTitle (R.id.compose_title)). Ahora, en algún caso, quiero editar la cadena y luego usarla para establecer el título. Cómo puedo hacer esto ?

PD: Necesito cambiar el valor de una sola cadena solamente, por lo que declarar un nuevo strings.xml para cada caso (que son variables dependiendo del usuario) usando la localización parece ser un poco ineficiente.

Una cosa que debes entender aquí es que, cuando proporcionas datos como Recurso, no se pueden modificar durante el tiempo de ejecución. Por ejemplo, los elementos extraíbles que tiene en su carpeta dibujable no se pueden modificar en tiempo de ejecución. Para ser precisos, la carpeta “res” no se puede modificar programáticamente.

Esto se aplica a Strings.xml también, es decir, a la carpeta “Valores”. Si desea una cadena que deba modificarse en tiempo de ejecución, cree una clase separada y coloque las cadenas en esta clase y acceda durante el tiempo de ejecución. Esta es la mejor solución que he encontrado.

No creo que pueda personalizar mediante progtwigción la clase R , ya que ADT la construye automáticamente.

ejemplo howto:

¿cómo? cambiando una referencia variable a otra referencia

uso:

setRColor(pl.mylib.R.class,"endColor",pl.myapp.R.color.startColor); // override app_name in lib R class setRString(pl.mylib.R.class,"app_name",pl.myapp.R.string.app_name); 

métodos básicos:

 public static void setRColor(Class rClass, String rFieldName, Object newValue) { setR(rClass, "color", rFieldName, newValue); } public static void setRString(Class rClass, String rFieldName, Object newValue) { setR(rClass, "string", rFieldName, newValue); } // AsciiStrings.STRING_DOLAR = "$"; public static void setR(Class rClass, String innerClassName, String rFieldName, Object newValue) { setStatic(rClass.getName() + AsciiStrings.STRING_DOLAR + innerClassName, rFieldName, newValue); } 

métodos de ayuda:

 public static boolean setStatic(String aClassName, String staticFieldName, Object toSet) { try { return setStatic(Class.forName(aClassName), staticFieldName, toSet); } catch (ClassNotFoundException e) { e.printStackTrace(); return false; } } public static boolean setStatic(Class< ?> aClass, String staticFieldName, Object toSet) { try { Field declaredField = aClass.getDeclaredField(staticFieldName); declaredField.setAccessible(true); declaredField.set(null, toSet); return true; } catch (Exception e) { e.printStackTrace(); return false; } } 

@ bradenV2 Mi aplicación es compatible con muchos idiomas, así que quería tomar una cadena de mi strings.xml que está actualmente en uso y cambiar eso, y luego usar ese – atuljangra 12 de marzo de 12 a 22:04

ps la solución anterior es buena, por ejemplo, cuando quieres inyectar algunos datos en lib / jar ya comstackdo. Pero si desea localizar cadenas simplemente haga que la carpeta resiga por CÓDIGO LANG como values-CC donde cc es lang code (values-de, values-cs) etc.

entonces tienes 2 opciones:

  1. selección de idioma dependiente del sistema “integrado” – basado en el idioma seleccionado por el dispositivo
  2. a través de crear recursos para la configuración, usted decide qué demostración de idioma

Me gusta esto:

 configuration = new Configuration(resources.getConfiguration()); configuration.setLocale(targetLocale); String localized = Context.createConfigurationContext(configuration) .getResources() .getString(resourceId); 

enter image description here

Tuve una situación como esta, donde uno de mis valores strings.xml tenía algo de dinámica. Configuré strings.xml con un “texto de reemplazo” (algo así como %%REPLACEMENT_EMAIL%% ), y cuando quise usar esa cadena programáticamente, recuperé el valor de cadena del recurso y reemplacé las instancias de ese texto de reemplazo con el valor dynamic (por ejemplo, entrada por el usuario).

Para ser sincero, mi aplicación aún no se ha traducido, pero sigo intentando seguir las mejores prácticas sin codificar las cadenas.

Tal vez quiera “modificar” el string.xml para que cuando la actividad lo requiera nuevamente use el nuevo valor, por ejemplo, para mantener un nuevo título dynamic después de la rotación de la pantalla.

Primero, no puedes modificar el recurso. Ya está comstackdo. No puede modificar la clase R (¿para qué?) Todos sus atributos son “finales”.

Por lo tanto, para el ejemplo anterior, puede usar onSaveInstanceState () y onRestoreInstanceState () para las propiedades que desea mantener en exhibición.

De acuerdo con mi conocimiento, no puede cambiar el valor del recurso (valor de clase R) mientras se ejecuta la aplicación. ¿Por qué no intentas almacenar con preferencia compartida? Te recomiendo que uses preferencia compartida

Use SharedPreferences en una clase Java. Le dará más versatilidad si decide tomar valores del exterior (web). Completar la clase Java en tiempo de ejecución puede ser inútil sin conexión. En el caso de las Preferencias Compartidas , debe asegurarse de que se carguen solo una vez, durante el primer inicio de la aplicación, y luego se actualicen solo por solicitud manual, ya que se utilizará la importación anterior.

 myActivity.getSharedPreferences( "com.example.imported", 0) .edit() .putString( "The news", getTheNews()) .apply();