programación - manual android studio avanzado
Obtenga valor de color mediante programación cuando se trata de una referencia(tema) (4)
Esto debería hacer el trabajo:
TypedValue typedValue = new TypedValue();
Theme theme = context.getTheme();
theme.resolveAttribute(R.attr.theme_color, typedValue, true);
@ColorInt int color = typedValue.data;
También asegúrese de aplicar el tema a su Actividad antes de llamar a este código. Cualquiera de usar:
android:theme="@style/Theme.BlueTheme"
en su manifiesto o llamada (antes de llamar a setContentView(int)
):
setTheme(R.style.Theme_BlueTheme)
en onCreate()
.
Lo probé con tus valores y funcionó perfectamente.
Considera esto:
styles.xml
<style name="BlueTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="theme_color">@color/theme_color_blue</item>
</style>
attrs.xml
<attr name="theme_color" format="reference" />
color.xml
<color name="theme_color_blue">#ff0071d3</color>
Entonces, el tema hace referencia al color del tema. ¿Cómo puedo obtener theme_color (referencia) programáticamente? Normalmente usaría getResources().getColor()
pero no en este caso porque está referenciado.
Esto funcionó para mí:
int[] attrs = {R.attr.my_attribute};
TypedArray ta = context.obtainStyledAttributes(attrs);
int color = ta.getResourceId(0, android.R.color.black);
ta.recycle();
si quieres sacar la cadena de hexágonos:
Integer.toHexString(color)
Para agregar a la respuesta aceptada, si está usando kotlin.
fun Context.getColorFromAttr(
@AttrRes attrColor: Int,
typedValue: TypedValue = TypedValue(),
resolveRefs: Boolean = true
): Int {
theme.resolveAttribute(attrColor, typedValue, resolveRefs)
return typedValue.data
}
y luego en tu actividad puedes hacer
textView.setTextColor(getColorFromAttr(R.attr.color))
Si quieres obtener varios colores, puedes usar:
int[] attrs = {R.attr.customAttr, android.R.attr.textColorSecondary,
android.R.attr.textColorPrimaryInverse};
Resources.Theme theme = context.getTheme();
TypedArray ta = theme.obtainStyledAttributes(attrs);
int[] colors = new int[attrs.length];
for (int i = 0; i < attrs.length; i++) {
colors[i] = ta.getColor(i, 0);
}
ta.recycle();