¿Cómo obtener color de acento mediante programación?


87

¿Cómo se obtendría el color de acento establecido en estilos, como a continuación, mediante programación?

    <item name="android:colorAccent">@color/material_green_500</item>

3
Cualquiera que vote en contra debe sentirse muy libre de publicar sus pensamientos en un comentario ...
— Jakob

Respuestas:


130

Puede obtenerlo del tema actual de esta manera:

private int fetchAccentColor() {
    TypedValue typedValue = new TypedValue();

    TypedArray a = mContext.obtainStyledAttributes(typedValue.data, new int[] { R.attr.colorAccent });
    int color = a.getColor(0, 0);

    a.recycle();

    return color;
}

¿Qué pasa con la versión de soporte?
— DariusL

4
Esta es la versión de soporte.
— rciovati

¿Podemos establecer una cadena RGB en colorPrimary en styles.xml o colors.xml?
— Tanveer Bulsari

2
Esto me devuelve un número negativo. ¿Sigue siendo esta la forma válida de obtener el color de acento?
— Naveed

1
¿A qué hace referencia typedValue.data?
— GPack

45

Esto funcionó para mí también:

public static int getThemeAccentColor (final Context context) {
    final TypedValue value = new TypedValue ();
    context.getTheme ().resolveAttribute (R.attr.colorAccent, value, true);
    return value.data;
}

También tengo el mismo problema en esta solución, valor negativo, y cae :(
— batsheva

2
El valor negativo está bien. ¡Es un color!
— copolii

pero mi aplicación se atasca con eroor sin recurso encontrado ... ¡esto no sucede cuando pongo un color regular! así que el valor no está bien
— batsheva

Entonces, ¿de dónde viene el valor negativo si no se encuentra el recurso? Todo lo que digo es que 0xff2506ac (por ejemplo) es un número negativo y un valor de color válido.
— copolii

2
El valor negativo que obtiene es el color real, no la identificación del recurso. No lo use como identificación de recurso.
— copolii

28
private static int getThemeAccentColor(Context context) {
    int colorAttr;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        colorAttr = android.R.attr.colorAccent;
    } else {
        //Get colorAccent defined for AppCompat
        colorAttr = context.getResources().getIdentifier("colorAccent", "attr", context.getPackageName());
    }
    TypedValue outValue = new TypedValue();
    context.getTheme().resolveAttribute(colorAttr, outValue, true);
    return outValue.data;
}

2
Esta es la única respuesta que no depende de la importación de la clase R de la aplicación, que es ideal para crear vistas personalizadas.
— Allan Veloso

12

Para aquellos de ustedes que usan Kotlin

fun Context.themeColor(@AttrRes attrRes: Int): Int {
    val typedValue = TypedValue()
    theme.resolveAttribute (attrRes, typedValue, true)
    return typedValue.data
}

11

Tengo un método estático en una clase de utils para obtener los colores del tema actual. La mayoría de las veces es colorPrimary, colorPrimaryDark y accentColor, pero puede obtener mucho más.

@ColorInt
public static int getThemeColor
(
        @NonNull final Context context,
        @AttrRes final int attributeColor
)
{
    final TypedValue value = new TypedValue();
    context.getTheme ().resolveAttribute (attributeColor, value, true);
    return value.data;
}

7

Aquí está mi opinión sobre esto:

public static String getThemeColorInHex(@NonNull Context context, @NonNull String colorName, @AttrRes int attribute) {
    TypedValue outValue = new TypedValue();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        context.getTheme().resolveAttribute(attribute, outValue, true);
    } else {
        // get color defined for AppCompat
        int appCompatAttribute = context.getResources().getIdentifier(colorName, "attr", context.getPackageName());
        context.getTheme().resolveAttribute(appCompatAttribute, outValue, true);
    }
    return String.format("#%06X", (0xFFFFFF & outValue.data));
}

Uso:

    String windowBackgroundHex = getThemeColorInHex(this, "windowBackground", android.R.attr.windowBackground);
    String primaryColorHex = getThemeColorInHex(this, "colorPrimary", R.attr.colorPrimary);

2
La String.format()ayuda a explicar cómo convertir el valor entero negativo a una cadena de color hexadecimal.
— Mr-IDE

1
¡Esta es una solución mucho mejor / genérica que la respuesta aceptada para esta pregunta!
— Nilesh Pawar


1

Solución de Kotlin:

    context.obtainStyledAttributes(TypedValue().data, intArrayOf(R.attr.colorAccent)).let {
        Log.d("AppLog", "color:${it.getColor(0, 0).toHexString()}")
        it.recycle()
    }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.