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 à dependencies
matriz 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 " .
ContextCompat
classe 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 AppcompatV7
responder.
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 getColor
nã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 context
não é nulo. A função getColor()
aceita apenas um contexto não nulo. Leia mais aqui sobre let
e 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 ResourcesCompat
Biblioteca 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 ContextCompat
desde 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;
}