Respostas:
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
android.R.color.some_color
muito por exemplo: getResources().getColor(android.R.color.holo_blue_bright)
(pelo menos, na API 17)
ContextCompat
e ResourcesCompat
? Se não houver diferença prática, seria menos confuso se você removesse um deles da sua resposta.
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 ThemeOverlay
uso 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
Theme
pode ser passado como null, então basta chamar getColor(R.color.my_color, null)
se não tiver certeza que tema para passar no.
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>
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);
getResources()
em um Activity
ou Fragment
?
getResources()
fora de uma Atividade ou Fragmento.
getResources()
também está disponível como uma API pública em qualquer coisa que implemente o Contexto e também no Views.
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);
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 ()
Quando você não tem Context
acesso , como um método em sua Util
classe.
Suponha abaixo o método sem contexto.
public void someMethod(){
...
// can't use getResource() without Context.
}
Agora você passará Context
como 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 Application
turma 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
<application
tag. (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.
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));
}
}
Resources.getColor(int, Theme)
se puder? Você não deve capturar exceções de tempo de execução.
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)
);
Encontrei uma maneira mais fácil que também funciona:
Color.parseColor(getString(R.color.idname);
Acessar cores de uma classe de não atividade pode ser difícil. Uma das alternativas que eu encontrei estava usando enum
. enum
oferece 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;
}
}
Método de trabalho mais recente:
getColor(R.color.snackBarAction)
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_INT
como abaixo:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
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))