Obtener el color de fondo de un diseño

3 minutos de lectura

Quiero encontrar el color de fondo de un diseño de mi código. ¿Hay alguna manera de encontrarlo? algo como linearLayout.getBackgroundColor()?

  • Dado que el fondo puede no ser un color, puede usar linearLayout.getBackground() que le dará una Drawable. No hay una API para obtener el color de fondo, específicamente. Lea más en los documentos para Ver

    – Simón Forsberg

    8 de febrero de 2013 a las 18:47

  • Pero realmente necesito encontrar el color de un diseño. ¡Debería haber alguna otra manera! o es posible obtenerlo de Drawable?

    –Srujan Simha

    8 de febrero de 2013 a las 18:53


  • ¿Por qué no sacas el color de fondo del tema?

    – jpaugh

    4 de enero de 2021 a las 6:23

avatar de usuario
Rico

Esto solo se puede lograr en API 11+ si su fondo es de un color sólido.

int color = Color.TRANSPARENT;
Drawable background = view.getBackground();
if (background instanceof ColorDrawable)
    color = ((ColorDrawable) background).getColor();

  • ¡Solo iba a editar mi respuesta y decir que específicamente eso podría funcionar! Sin embargo, no estoy seguro de por qué hay una restricción API 11+. ColorDrawable parece estar disponible desde API 1, y también view.getBackground().

    – Simón Forsberg

    8 de febrero de 2013 a las 18:58


  • No importa. veo que .getColor para ColorDrawable se agregó en API 11.

    – Simón Forsberg

    8 de febrero de 2013 a las 19:01

  • Podrías convertir el Drawable a un Bitmap y obtener el primer píxel. int color = bitmap.getPixel(0, 0);

    – Jared Rummler

    15 de enero de 2015 a las 4:11

  • usé esto ((ColorDrawable) row.getBackground()).getColor() como (row.background as ColorDrawable).color pero me enfrenté a este error android.graphics.drawable.StateListDrawable cannot be cast to android.graphics.drawable.ColorDrawable

    – milad salimi

    8 de agosto de 2019 a las 5:59

Para obtener el color de fondo de un diseño:

LinearLayout lay = (LinearLayout) findViewById(R.id.lay1);
ColorDrawable viewColor = (ColorDrawable) lay.getBackground();
int colorId = viewColor.getColor();

Si es RelativeLayout, simplemente encuentre su id y use allí el objeto en lugar de LinearLayout.

  • ¿Hay alguna razón en contra de usar ViewGroup (o incluso View) en lugar de todas sus posibles subclases para obtener el fondo?

    – El increíble Jan

    3 de diciembre de 2021 a las 7:24


ColorDrawable.getColor() solo funcionará con un nivel de API superior a 11, por lo que puede usar este código para admitirlo desde el nivel de API 1. Use la reflexión por debajo del nivel de API 11.

public static int getBackgroundColor(View view) {
        Drawable drawable = view.getBackground();
        if (drawable instanceof ColorDrawable) {
            ColorDrawable colorDrawable = (ColorDrawable) drawable;
            if (Build.VERSION.SDK_INT >= 11) {
                return colorDrawable.getColor();
            }
            try {
                Field field = colorDrawable.getClass().getDeclaredField("mState");
                field.setAccessible(true);
                Object object = field.get(colorDrawable);
                field = object.getClass().getDeclaredField("mUseColor");
                field.setAccessible(true);
                return field.getInt(object);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return 0;
    }

Manera corta y simple:

int color = ((ColorDrawable)view.getBackground()).getColor();

Para los fanáticos de Kotlin

fun View.getBackgroundColor() = (background as? ColorDrawable?)?.color ?: Color.TRANSPARENT

avatar de usuario
Rafael C.

Creo que hay casos en los que el fondo podría no ser un ColorDrawable así que tenemos que comprobarlo antes del lanzamiento:

 if (view.background is ColorDrawable) {
     val bgColor = (view.background as ColorDrawable).color
 }

¿Ha sido útil esta solución?