¿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>
Jakob
fuente
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;
}
rciovati
fuente
¿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;
}
copolii
fuente
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;
}
XYz Amos
fuente
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
}
Kevin
fuente
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;
}
Sotti
fuente
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);
Esdras Lopez
fuente
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
También es útil: stackoverflow.com/questions/6539879/…
Mr-IDE
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()
    }
desarrollador de Android
fuente