O Resources.getColor(int id)método foi preterido.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
O que devo fazer?
O Resources.getColor(int id)método foi preterido.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
O que devo fazer?
Respostas:
A partir da Biblioteca de suporte Android 23,
um novo método getColor () foi adicionado a ContextCompat.
Sua descrição do JavaDoc oficial:
Retorna uma cor associada a um ID de recurso específico
Começando em M, a cor retornada será estilizada para o tema do contexto especificado.
Então, basta ligar para :
ContextCompat.getColor(context, R.color.your_color);
Você pode verificar o ContextCompat.getColor() código fonte no GitHub .
tl; dr:
ContextCompat.getColor(context, R.color.my_color)
Explicação:
Você precisará usar ContextCompat.getColor () , que faz parte da Biblioteca Support V4 (funcionará para todas as APIs anteriores).
ContextCompat.getColor(context, R.color.my_color)
Se você ainda não usa a Biblioteca de Suporte, precisará adicionar a seguinte linha à dependenciesmatriz dentro do seu aplicativo build.gradle(nota: é opcional se você já usa a biblioteca appcompat (V7) ):
compile 'com.android.support:support-v4:23.0.0' # or any version above
Se você se preocupa com temas, a documentação especifica que:
Começando em M, a cor retornada será estilizada para o tema do contexto especificado
M, a cor retornada será estilizada para o tema do contexto especificado " .
ContextCompatclasse vem do SupportV4. O AppcompatV7 também funciona, pois depende do SupportV4. Como se costuma dizer na documentação da Biblioteca de Apoio , This library depends on the v4 Support Library. If you are using Ant or Eclipse, make sure you include the v4 Support Library as part of this library's classpath.. Portanto, faz sentido não AppcompatV7responder.
Não quero incluir a biblioteca de suporte apenas para getColor , então estou usando algo como
public static int getColorWrapper(Context context, int id) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return context.getColor(id);
} else {
//noinspection deprecation
return context.getResources().getColor(id);
}
}
Eu acho que o código deve funcionar muito bem, e o obsoleto getColornão pode desaparecer da API <23.
E é isso que estou usando no Kotlin:
/**
* Returns a color associated with a particular resource ID.
*
* Wrapper around the deprecated [Resources.getColor][android.content.res.Resources.getColor].
*/
@Suppress("DEPRECATION")
@ColorInt
fun getColorHelper(context: Context, @ColorRes id: Int) =
if (Build.VERSION.SDK_INT >= 23) context.getColor(id) else context.resources.getColor(id);
No Android Marshmallow, muitos métodos estão obsoletos.
Por exemplo, para obter cores, use
ContextCompat.getColor(context, R.color.color_name);
Também para obter uso extraível
ContextCompat.getDrawable(context, R.drawable.drawble_name);
Para todos os usuários do Kotlin por aí:
context?.let {
val color = ContextCompat.getColor(it, R.color.colorPrimary)
// ...
}
val color = ContextCompat.getColor(context, R.color.colorPrimary). A variável "it" pode ser qualquer coisa, mas precisa ser um Contexto .
ité neste caso o context, desde que eu uso context?.let {para verificar se o contextnão é nulo. A função getColor()aceita apenas um contexto não nulo. Leia mais aqui sobre lete como usá-lo: kotlinlang.org/docs/reference/scope-functions.html#let
In Your RecyclerView em Kotlin
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(t: YourObject, listener: OnItemClickListener.YourObjectListener) = with(itemView) {
textViewcolor.setTextColor(ContextCompat.getColor(itemView.context, R.color.colorPrimary))
textViewcolor.text = t.name
}
}
Use o getColor(Resources, int, Theme)método da na ResourcesCompatBiblioteca de suporte do Android.
int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
Eu acho que isso reflete melhor a sua pergunta do que a getColor(Context, int)da ContextCompatdesde que você pergunta Resources. Antes do nível 23 da API, o tema não seria aplicado e o método passaria para, getColor(int)mas você não receberá o aviso preterido. O tema também pode ser null.
Se você não precisa necessariamente dos recursos, use parseColor(String):
Color.parseColor("#cc0066")
Se o seu min atual. O nível da API é 23, você pode simplesmente usargetColor() como estamos usando para obter recursos de string getString():
//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()
Você pode restringir os níveis de API abaixo de 23:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
mas, para simplificar, faça o seguinte abaixo como resposta aceita:
textView.setTextColor(ContextCompat.getColor(context, R.color.green))
De Recursos .
Também fiquei frustrado. Minha necessidade era muito direta. Tudo o que eu queria era a cor ARGB dos recursos, então escrevi um método estático simples.
protected static int getARGBColor(Context c, int resId)
throws Resources.NotFoundException {
TypedValue color = new TypedValue();
try {
c.getResources().getValue(resId, color, true);
}
catch (Resources.NotFoundException e) {
throw(new Resources.NotFoundException(
String.format("Failed to find color for resourse id 0x%08x",
resId)));
}
if (color.type != TYPE_INT_COLOR_ARGB8) {
throw(new Resources.NotFoundException(
String.format(
"Resourse id 0x%08x is of type 0x%02d. Expected TYPE_INT_COLOR_ARGB8",
resId, color.type))
);
}
return color.data;
}