studio programación programacion herramientas gratis fundamentos curso con avanzado aplicaciones android android-resources android-theme

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();