Resources.getColor(int id)
Yöntem, kullanımdan kaldırıldı.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Ne yapmalıyım?
Resources.getColor(int id)
Yöntem, kullanımdan kaldırıldı.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Ne yapmalıyım?
Yanıtlar:
Android Destek Kitaplığı 23'ten başlayarak
yeni bir getColor () yöntemi eklendi ContextCompat
.
Resmi JavaDoc'tan açıklaması:
Belirli bir kaynak kimliğiyle ilişkilendirilmiş bir renk döndürür
M ile başlayarak, döndürülen renk belirtilen Bağlamın teması için stillendirilir.
Yani, sadece arayın :
ContextCompat.getColor(context, R.color.your_color);
ContextCompat.getColor()
Kaynak kodunu GitHub'da kontrol edebilirsiniz .
tl; dr:
ContextCompat.getColor(context, R.color.my_color)
Açıklama:
Destek V4 Kitaplığı'nın bir parçası olan ContextCompat.getColor () yöntemini kullanmanız gerekir ( önceki tüm API'larda çalışır).
ContextCompat.getColor(context, R.color.my_color)
Destek Kitaplığı'nı henüz kullanmıyorsanız, dependencies
uygulamanızın içindeki diziye aşağıdaki satırı eklemeniz gerekir build.gradle
(not: zaten appcompat (V7) kitaplığını kullanıyorsanız isteğe bağlıdır ):
compile 'com.android.support:support-v4:23.0.0' # or any version above
Temaları önemsiyorsanız, belgeler şunları belirtir:
M ile başlayarak, döndürülen renk belirtilen Bağlamın teması için biçimlendirilir
M
, döndürülen renk belirtilen Bağlamın teması için biçimlendirilecek "
ContextCompat
sınıf SupportV4'ten geliyor. AppcompatV7, SupportV4'e dayandığı için de çalışır. Onlar dedikleri gibi Destek Kitaplığı belgelerine , 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.
. Bu yüzden AppcompatV7
cevaba vermemek mantıklı .
Sadece getColor için Destek kütüphanesini dahil etmek istemiyorum , bu yüzden böyle bir şey kullanıyorum
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);
}
}
Bence kod gayet iyi çalışmalı ve kullanımdan kaldırılmış getColor
API 23'ten yok olamaz.
Ve Kotlin'de kullandığım şey bu:
/**
* 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);
Android Marshmallow'da birçok yöntem kullanımdan kaldırıldı.
Örneğin, renk kullanımı elde etmek için
ContextCompat.getColor(context, R.color.color_name);
Ayrıca çekilebilir kullanım için
ContextCompat.getDrawable(context, R.drawable.drawble_name);
Dışarıdaki tüm Kotlin kullanıcıları için:
context?.let {
val color = ContextCompat.getColor(it, R.color.colorPrimary)
// ...
}
val color = ContextCompat.getColor(context, R.color.colorPrimary)
. "İt" değişkeni herhangi bir şey olabilir, ancak bir Bağlam olması gerekir .
it
bu durumda context
, çünkü ben null olmadığını context?.let {
kontrol etmek için kullanın context
. İşlev getColor()
yalnızca boş olmayan bir bağlamı kabul eder. Hakkında let
ve nasıl kullanılacağı hakkında daha fazla bilgi için: kotlinlang.org/docs/reference/scope-functions.html#let
Kotlin'deki Görünüm
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
}
}
Android Destek Kitaplığı'ndaki getColor(Resources, int, Theme)
yöntemini kullanın ResourcesCompat
.
int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
Sorunuzu, sormaktan getColor(Context, int)
bu ContextCompat
yana olduğundan daha iyi yansıttığını düşünüyorum Resources
. API düzey 23'ten önce tema uygulanmayacak ve yöntem çağrılır, getColor(int)
ancak kullanımdan kaldırılmış uyarınız olmaz. Tema da olabilir null
.
Kaynaklara ihtiyacınız yoksa, şunu kullanın parseColor(String)
:
Color.parseColor("#cc0066")
Senin Eğer geçerli min. API düzeyi 23'tür,getColor()
dize kaynaklarını elde etmek için kullandığımız gibi kullanabilirsinizgetString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()
23'ün altındaki API Düzeyleri için kısıtlama yapabilirsiniz:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
ama basit tutmak için, aşağıdaki gibi kabul edilebilir cevap olarak yapabilirsiniz:
textView.setTextColor(ContextCompat.getColor(context, R.color.green))
Gönderen Kaynakları .
Gönderen ContextCompat AndroidX .
Gönderen ContextCompat Destek
Ben de sinirli oldum. Benim ihtiyacım çok açıktı. Tek istediğim kaynaklardan gelen ARGB rengiydi, bu yüzden basit bir statik yöntem yazdım.
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;
}