¿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.