android get - Obtener color-int del recurso de color




xml to (6)

¿Hay una manera de obtener un int de color de un recurso de color? Estoy tratando de obtener los componentes individuales rojos, azules y verdes de un color definido en el recurso (R.color.myColor) para poder establecer los valores de tres barras de búsqueda a un nivel específico.

Para obtener más información sobre otro caso de uso que pueda ayudar a que surja esta pregunta en los resultados de búsqueda, quise aplicar alfa a un color definido en mis recursos.

Usando la respuesta correcta de @ sat:

int alpha = ... // 0-255, calculated based on some business logic
int actionBarBackground = getResources().getColor(R.color.actionBarBackground);
int actionBarBackgroundWithAlpha = Color.argb(
        alpha,
        Color.red(actionbarBackground),
        Color.green(actionbarBackground),
        Color.blue(actionbarBackground)
);

Answers

Puedes usar:

getResources().getColor(R.color.idname);

Marque aquí sobre cómo definir colores personalizados:

http://sree.cc/google/android/defining-custom-colors-using-xml-in-android

EDIT (1): Dado que getColor(int id) está en desuso ahora, debe usarse:

ContextCompat.getColor(context, R.color.your_color);

(agregado en la biblioteca de soporte 23)

EDITAR (2):

El código que se muestra a continuación se puede usar para Marshmallow anterior y posterior (API 23)

ResourcesCompat.getColor(getResources(), R.color.your_color, null); //without theme

ResourcesCompat.getColor(getResources(), R.color.your_color, your_theme); //with theme

Basado en la nueva biblioteca de soporte de Android (y this actualización), ahora debe llamar:

ContextCompat.getColor(context, R.color.name.color);

Según la this :

public int getColor (int id)

Este método fue desaprobado en el nivel de API 23 . Use getColor (int, Theme) en su lugar

Es la misma solución para getResources().getColorStateList(id) :

Tienes que cambiarlo así:

ContextCompat.getColorStateList(getContext(),id);

Define tu color

valores / color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- color int as #AARRGGBB (alpha, red, green, blue) -->
    <color name="orange">#fff3632b</color>
    ...
    <color name="my_view_color">@color/orange</color>

</resources>

Consigue el color int y configúralo.

int backgroundColor = ContextCompat.getColor(context, R.color.my_view_color);
// Color backgroundColor = ... (Don't do this. The color is just an int.)

myView.setBackgroundColor(backgroundColor);

Ver también


Acceder a los colores desde una clase sin actividad puede ser difícil. Una de las alternativas que encontré fue usar enum . enum ofrece mucha flexibilidad.

public enum Colors
{
  COLOR0(0x26, 0x32, 0x38),    // R, G, B
  COLOR1(0xD8, 0x1B, 0x60),
  COLOR2(0xFF, 0xFF, 0x72),
  COLOR3(0x64, 0xDD, 0x17);


  private final int R;
  private final int G;
  private final int B;

  Colors(final int R, final int G, final int B)
  {
    this.R = R;
    this.G = G;
    this.B = B;
  }

  public int getColor()
  {
    return (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);
  }

  public int getR()
  {
    return R;
  }

  public int getG()
  {
    return G;
  }

  public int getB()
  {
    return B;
  }
}

ContextCompat.getColor(context, R.color.your_color); para usar ContextCompat.getColor(context, R.color.your_color); pero a veces (en algunos dispositivos / versiones de Android. No estoy seguro) eso causa una excepción NullPointerExcepiton.

Entonces, para hacer que funcione en todos los dispositivos / versiones, recurro a la antigua forma de hacerlo, en el caso de un puntero nulo.

try {
    textView.setTextColor(ContextCompat.getColor(getActivity(), R.color.text_grey_dark));
}
catch(NullPointerException e) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        textView.setTextColor(getContext().getColor(R.color.text_grey_dark));
    }
    else {
        textView.setTextColor(getResources().getColor(R.color.text_grey_dark));
    }
}

Existe una solución más simple. Establezca estos atributos en su diseño padre:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true" >

Y ahora, cuando la actividad comience, este diseño principal se enfocará por defecto.

Además, podemos eliminar el enfoque de las vistas secundarias en el tiempo de ejecución (p. Ej., Después de finalizar la edición secundaria) volviendo a centrar la atención en el diseño principal, así:

findViewById(R.id.mainLayout).requestFocus();

Buen comentario de Guillaume Perrot :

android:descendantFocusability="beforeDescendants" parece ser el valor predeterminado (el valor entero es 0). Funciona simplemente agregando android:focusableInTouchMode="true" .

En realidad, podemos ver que los beforeDescendants establecidos como predeterminados en el método ViewGroup.initViewGroup() (Android 2.2.2). Pero no es igual a 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Gracias a Guillaume.





android colors