En primer lugar, esta pregunta hace una pregunta muy similar. Sin embargo, mi pregunta tiene una sutil diferencia.
Lo que me gustaría saber es si es posible cambiar mediante programación el colorPrimary
atributo de un tema a un color arbitrario .
Entonces, por ejemplo, tenemos:
<style name="AppTheme" parent="android:Theme.Material.Light">
<item name="android:colorPrimary">#ff0000</item>
<item name="android:colorAccent">#ff0000</item>
</style>
En tiempo de ejecución, el usuario decide que quiere usarlo #ccffff
como color primario. Por supuesto, no hay forma de que pueda crear temas para todos los colores posibles.
No me importa si tengo que hacer cosas extravagantes, como confiar en los elementos internos privados de Android, siempre que funcione con el SDK público.
Mi objetivo es tener eventualmente los ActionBar
y todos los widgets como CheckBox
para usar este color primario.
android
android-5.0-lollipop
nhaarman
fuente
fuente
Respuestas:
Los temas son inmutables, no puedes.
fuente
Leí los comentarios sobre la aplicación de contactos y cómo usa un tema para cada contacto.
Probablemente, la aplicación de contactos tiene algunos temas predefinidos (para cada color primario del material desde aquí: http://www.google.com/design/spec/style/color.html ).
Puede aplicar un tema antes del método setContentView dentro del método onCreate.
Luego, la aplicación de contactos puede aplicar un tema al azar a cada usuario.
Este método es:
Pero este método tiene un problema, por ejemplo, puede cambiar el color de la barra de herramientas, el color del efecto de desplazamiento, el color de ondulación, etc., pero no puede cambiar el color de la barra de estado y el color de la barra de navegación (si también desea cambiarlo).
Luego, para resolver este problema, puede usar el método antes y:
Estos dos métodos cambian el color de la barra de navegación y estado. Recuerde, si configura la barra de navegación como translúcida, no puede cambiar su color.
Este debería ser el código final:
Puede usar un interruptor y generar un número aleatorio para usar temas aleatorios o, como en la aplicación de contactos, cada contacto probablemente tenga un número predefinido asociado.
Una muestra de tema:
Lo siento por mi ingles.
fuente
Puede usar Theme.applyStyle para modificar su tema en tiempo de ejecución al aplicarle otro estilo.
Digamos que tiene estas definiciones de estilo:
Ahora puedes parchear tu tema en tiempo de ejecución de esta manera:
¡Se
applyStyle
debe llamar al método antes de que se infle el diseño! Por lo tanto, a menos que cargue la vista manualmente, debe aplicar estilos al tema antes de llamarsetContentView
a su actividad.Por supuesto, esto no se puede usar para especificar un color arbitrario, es decir, uno de cada 16 millones (256 3 ) colores. Pero si escribe un pequeño programa que genera las definiciones de estilo y el código Java para usted, entonces debería ser posible algo así como uno de 512 (8 3 ).
Lo que hace que esto sea interesante es que puede usar diferentes superposiciones de estilo para diferentes aspectos de su tema. Simplemente agregue algunas definiciones de superposición,
colorAccent
por ejemplo. Ahora puede combinar diferentes valores para el color primario y el color de acento casi arbitrariamente.Debe asegurarse de que las definiciones de tema de superposición no hereden accidentalmente un montón de definiciones de estilo de una definición de estilo principal. Por ejemplo, un estilo llamado
AppTheme.OverlayRed
implícitamente hereda todos los estilos definidosAppTheme
y todas estas definiciones también se aplicarán cuando parchee el tema maestro. Por lo tanto, evite los puntos en los nombres de los temas superpuestos o use algo comoOverlay.Red
y definaOverlay
como un estilo vacío.fuente
applyStyle
antes de llamarsetContentView
a su actividad y debería funcionar.He creado alguna solución para crear temas de cualquier color, tal vez esto pueda ser útil para alguien. API 9+
1. primero cree " res / values-v9 / " y coloque allí este archivo: styles.xml y la carpeta regular "res / values" se usará con sus estilos.
2. ponga este código en su res / values / styles.xml:
3. en AndroidManifest:
4. cree una nueva clase con el nombre "ThemeColors.java"
5. Actividad principal:
Para cambiar el color, simplemente reemplace Aleatorio con su RGB, espero que esto ayude.
Hay un ejemplo completo: ColorTest.zip
fuente
context.setTheme(context.getResources().getIdentifier("T_" + stringColor, "style", context.getPackageName()));
¿puede darme una explicación o un enlace para seguir este tema?Utilicé el código de Dahnark pero también necesito cambiar el fondo de la barra de herramientas:
fuente
No puede cambiar el color de colorPrimary, pero puede cambiar el tema de su aplicación agregando un nuevo estilo con un color diferente Color primario
y dentro del tema del conjunto de actividades
fuente
de una actividad que puedes hacer:
fuente
UTILICE UNA BARRA DE HERRAMIENTAS
Puede establecer un color de elemento de barra de herramientas personalizado dinámicamente creando una clase de barra de herramientas personalizada:
luego consúltelo en su archivo de diseño. Ahora puede establecer un color personalizado usando
Fuentes:
Encontré la información para hacer esto aquí: Cómo cambiar dinámicamente el color de los iconos de la barra de herramientas de Android
y luego lo edité , lo mejoré y lo publiqué aquí: GitHub: AndroidDynamicToolbarItemColor
fuente
Esto es lo que puedes hacer:
escribir un archivo en una carpeta dibujable, nombremoslo background.xml
luego configure su diseño (o lo que sea el caso)
android:background="@drawable/background"
al configurar su tema, este color representaría lo mismo.
fuente