Obter color-int a partir de recursos de cores

447

Existe uma maneira de obter uma int de cor a partir de um recurso de cor? Estou tentando obter os componentes individuais de vermelho, azul e verde de uma cor definida no recurso (R.color.myColor) para que eu possa definir os valores de três barras de busca para um nível específico.

ataulm
fonte

Respostas:

927

Você pode usar:

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

Confira aqui como definir cores personalizadas:

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

EDIT (1): Como getColor(int id)está obsoleto agora, isso deve ser usado:

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

(adicionado na biblioteca de suporte 23)

EDIT (2):

O código abaixo pode ser usado para pré e pós Marshmallow (API 23)

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

ResourcesCompat.getColor(getResources(), R.color.your_color, your_theme); //with theme
Sentou
fonte
7
O que é o android.R.color.some_color :-(
Blundell
17
@Blundell uhh, não sei se você precisar dele agora, mas isso funciona para android.R.color.some_colormuito por exemplo: getResources().getColor(android.R.color.holo_blue_bright)(pelo menos, na API 17)
ataulm
30
getColor () agora está obsoleto, você pode usar: ContextCompat.getColor (context, R.color.your_color);
19415 Ricardo
2
Sei que não foi você quem fez as edições, mas qual é a diferença entre ContextCompate ResourcesCompat? Se não houver diferença prática, seria menos confuso se você removesse um deles da sua resposta.
Suragch
14
Por que o Google sente a necessidade de descontinuar uma função perfeitamente boa para aquela terrível biblioteca compacta de aplicativos. É péssimo, tem os dois.
Andrew S
116

Com base na nova Biblioteca de Suporte Android (e nesta atualização), agora você deve ligar para:

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

De acordo com a documentação :

public int getColor (int id)

Este método foi descontinuado no nível 23 da API . Use getColor (int, Theme) em vez disso

É a mesma solução para getResources().getColorStateList(id):

Você tem que mudar assim:

ContextCompat.getColorStateList(getContext(),id);

EDIT 2019

Em relação ao ThemeOverlayuso do contexto da visualização mais próxima:

val color = ContextCompat.getColor(
  closestView.context,
  R.color.name.color
)

Dessa forma, você obtém a cor certa com base no seu ThemeOverlay.

Especialmente necessário quando na mesma atividade você usa temas diferentes, como tema escuro / claro. Se você gostaria de entender mais sobre Temas e Estilos, esta palestra é sugerida: Desenvolvendo Temas com Estilo

Nick Butcher - Droidcon Berlin - Desenvolvendo temas com estilo

Ultimo_m
fonte
10
Para aqueles que querem saber o que preencher como o tema no novo método, Themepode ser passado como null, então basta chamar getColor(R.color.my_color, null)se não tiver certeza que tema para passar no.
w3bshark
hmm ... é o que todo mundo diz, mas eu não consigo fazer funcionar. Tenho que inicializar o contexto? Atualmente, recebo "não é possível resolver o símbolo 'contexto'"
ColdTuna 27/09
Para certificar-se de que você está fazendo certo, tente chamá-lo dentro do onCreate da atividade, do que para obter contexto, você precisa chamar getContext () ou apenas "isto"
Ultimo_m
35

Defina sua cor

values ​​/ 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>

Obtenha a cor int e defina-a

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);

Veja também

Suragch
fonte
1
você pode usar apenas getResources()em um Activityou Fragment?
Zapnologica
2
@ Zapnologica, veja as respostas a esta pergunta para refletir sobre o uso getResources()fora de uma Atividade ou Fragmento.
Suragch
1
@Zapnologica no. getResources()também está disponível como uma API pública em qualquer coisa que implemente o Contexto e também no Views.
ataulm 11/08/2015
7

Melhor Abordagem

Como resposta @sat, uma boa abordagem para obter cores é

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

ou use abaixo quando você não tiver acesso ao getResources()método.

Context context  = getContext(); // like Dialog class
ResourcesCompat.getColor(context.getResources(), R.color.your_color, null);

O que eu faço é

public void someMethod(){
    ...
    ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
}

É mais simples de usar em qualquer lugar do seu aplicativo! Mesmo na classe Util ou qualquer classe em que você não tenha Context ou getResource ()

Problema (quando você não tem contexto)

Quando você não tem Contextacesso , como um método em sua Utilclasse.

Suponha abaixo o método sem contexto.

public void someMethod(){
    ...
    // can't use getResource() without Context.
}

Agora você passará Contextcomo parâmetro neste método e usarágetResources().

public void someMethod(Context context){
    ...
    context.getResources...
}

Então, aqui está uma solução exclusiva de bônus, pela qual você pode acessar recursos de qualquer lugar Util class. Adicione Resourcesà sua Applicationturma ou crie uma se ela não existir.

import android.app.Application;
import android.content.res.Resources;

public class App extends Application {
    private static App mInstance;
    private static Resources res;


    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        res = getResources();
    }

    public static App getInstance() {
        return mInstance;
    }

    public static Resources getResourses() {
        return res;
    }

}

Adicione um campo de nome à sua manifest.xml <applicationtag. (Se ainda não tiver sido adicionado)

<application
        android:name=".App"
        ...
        >
        ...
    </application>

Agora você está pronto para ir. Use ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);em qualquer lugar do aplicativo.

Khemraj
fonte
5

Eu atualizei para usar, ContextCompat.getColor(context, R.color.your_color);mas às vezes (em alguns dispositivos / versões do Android. Não tenho certeza) que causa um NullPointerExcepiton.

Portanto, para fazê-lo funcionar em todos os dispositivos / versões, recorro à antiga maneira de fazê-lo, no caso de um ponteiro 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));
    }
}
ninjachippie
fonte
por que não usar a versão antiga em todos os casos ou, se você estiver verificando a versão, use a nova API, Resources.getColor(int, Theme)se puder? Você não deve capturar exceções de tempo de execução.
precisa saber é
Apenas TOC, suponho. ContextCompat, para mim, parece ser a maneira futura de fazê-lo e, portanto, o caminho certo. Então, minha abordagem é: faça da maneira certa. E se isso falhar (em dispositivos antigos ou o que seja), faça da maneira antiga. Por que não devo capturar exceções em tempo de execução?
Ninjachippie
1

Para obter mais informações sobre outro caso de uso que possa ajudar a aflorar essa pergunta nos resultados da pesquisa, eu queria aplicar alfa a uma cor definida em meus recursos.

Usando a resposta correta do @ 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)
);
ataulm
fonte
1

Encontrei uma maneira mais fácil que também funciona:

Color.parseColor(getString(R.color.idname);
geckoflume
fonte
Interessante, não sabia que era possível obter a cor como uma corda dessa maneira. Eu não acho que é mais fácil, mas é interessante ata
ataulm 19/04
0

Acessar cores de uma classe de não atividade pode ser difícil. Uma das alternativas que eu encontrei estava usando enum. enumoferece muita flexibilidade.

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;
  }
}
Confundir
fonte
0

Método de trabalho mais recente:

getColor(R.color.snackBarAction)
zohaib Ansari
fonte
0

Se o seu min atual. O nível da API é 23, você pode simplesmente usar getColor()como estamos usando para getString():

//example
textView.setTextColor(getColor(R.color.green));
// if context is not available(ex: not in activity) use with context.getColor()

Se você quiser abaixo do nível da API 23, use este:

textView.setTextColor(getResources().getColor(R.color.green));

Mas observe que isso getResources().getColor()foi preterido no nível da API 23. Nesse caso, substitua acima por:

textView.setTextColor(ContextCompat.getColor(this /*context*/, R.color.green)) //Im in an activity, so I can use `this`

ContextCompat : Auxiliar para acessar recursos noContext

Se desejar, você pode restringir-se SDK_INTcomo abaixo:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    textView.setTextColor(getColor(R.color.green));
} else {
    textView.setTextColor(getResources().getColor(R.color.green));
}
Blasanka
fonte
0
ContextCompat.getColor(context, R.color.your_color);

em atividade

ContextCompat.getColor(actvityname.this, R.color.your_color);

em fragmento

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

por exemplo:

tvsun.settextcolour(ContextCompat.getColor(getActivity(), R.color.your_color))
indrajeet jyoti
fonte