Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo puedo cambiar programáticamente el valor de un color en colors.xml?

Estoy desarrollando una aplicación que será temática con diferentes colores e imágenes para diferentes clientes. Mientras tengo la opción de volver a escribir el archivo colors.xml con los colores personalizados en el tiempo de construcción, estoy inclinado hacia la configuración de los colores en tiempo de ejecución. Lo que me pregunto es si esa es alguna forma de cambiar programaticamente el valor de un color definido en el archivo colors.xml y hacer que el nuevo valor tenga efecto en TODOS los lugares donde se utiliza en la definición de diseño.

En otras palabras, si tengo:

<?xml version="1.0" encoding="UTF-8"?> <resources> <color headerColor="white">#FFF</color> <color backgroundColor="black">#000</color> </resources> 

Y un archivo de diseño con algo como:

 <TextView android:id="@+id/listItemHeaderActivity" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="12sp" android:textColor="@color/headerColor" android:background="@color/backgroundColor" android:text="@string/listTextHeaderActivity"/> 

¿Puedo cambiar el valor de headercolor y backgroundColor en Java y tenerlo en todas las vistas que usan esos valores? ¿O tendré que cambiar cada color de vista relevante individualmente cada vez que muestre esas vistas?

Gracias por adelantado.

  • Cómo convertir nombres de color a su código hexadecimal equivalente?
  • Android, cambia el color subrayado de un EditText dinámicamente
  • Android: definiendo colores haciendo referencia a otros colores definidos
  • Cambiar la casilla de verificación colorAccent en tiempo de ejecución mediante programación
  • Color negro androide a 85% de opacidad
  • Translúcido StatusBar con el color dinámico ActionBar en Android
  • Diseño de materiales paleta de colores
  • Cambiar color de android: activatedBackgroundIndicator
  • 2 Solutions collect form web for “¿Cómo puedo cambiar programáticamente el valor de un color en colors.xml?”

    Le ayudaría si describió por qué y cómo está utilizando este color dinámico y por qué desea hacerlo en tiempo de ejecución en lugar de tiempo de compilación. Pero asumiendo que tiene que ser la manera que usted pidió …

    Sugiero escribir una función de ayuda que todos los lugares pueden llamar y configurar.

     public int getMyColor(...) { // figure out which color to use, via a database call, // an asset load, some algorithm, or whatever you need ... // once color chosen, create an RGBA integer for it final int myColor = ... return myColor; } 

    Ahora llame a esto en cada actividad / fragmento que lo necesite y defina los atributos de color en las vistas apropiadas según sea necesario. (Con View.setBackgroundColor(...) , etc.)

    Sin embargo, para permitir que esto funcione en configuraciones XML y / o vistas previas de diseño de desarrollo, tendría que escribir una clase de vista personalizada para llamar a esa función de ayuda también. Dependiendo de dónde y cómo va a utilizar este color, puede no valer la pena.

    Esta solución no es muy elegante y requiere un montón de llamar a esta función de ayuda personalizada getMyColor en cada actividad / fragmento que lo necesita. Si sólo se establece uno o dos lugares, sin embargo, probablemente no es un gran problema. Una vez más, saber por qué usted quiere hacer esto en vez de preguntarnos cómo hacerlo, puede producir una mejor alternativa para usted.

    Por ejemplo, esto no es una respuesta a su pregunta, pero ¿ha pensado en temas? Todavía tendrá el problema de tener que configurarlos en el tiempo de construcción a menos que desee todo lo anterior, pero dependiendo de cómo está utilizando este color, podría ser mejor que el lío que he descrito anteriormente.

    Terminé haciendo algo algo similar a lo que creo que Jon puede estar describiendo. He creado una clase que extiende Fragmento (o SherlockFragment en mi caso). Esa clase tiene un nuevo método llamado "setCustomColors" que sólo toma la vista de fragmento y busca a todos sus hijos para ciertos tipos de vistas que deben personalizarse. Luego extendí esa clase para todos mis Fragmentos, y en el método onCreateView, llamo a la función, pasando la vista de fragmento actual. Déjeme saber si esa explicación no está clara (aunque tal vez esto no es un problema que mucha gente tendrá).

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.