getColor (int id) Android 6.0 Marshmallow'da (API 23) kullanımdan kaldırıldı


719

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?


26
ContextCompat.getColor (context, R.color.color_name) kullanın
Ashokchakravarthi Nagarajan

Yukarıda belirtilen bu yöntemle: getColor (context, R.color.your_color); "Bağlamın" nasıl elde edileceği açık değildir. Benim durumumda, android studio 3.2'de bağlam koyarak işe yaramaz. Bunun benim için işe yaradığını düşünüyorum. .setTextColor (Color.RED).
Harry

Yanıtlar:


1349

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 .


1
Bu çözüm gibi görünüyor, ancak "Burada kaynak kimliği yerine çözülmüş renk geçmeli" hatası aldığımızda ne yapmamız gerekiyor? Bildiğim kadarıyla muhtemelen Lint, Destek Kitaplığı'nın yeni API'sini tanımıyor, bu yüzden belki de sadece bir açıklama eklemek için @SuppressWarnings ("ResourceAsColor") gitmek için bir yol? Yine de çok sevmiyorum.
Stan

1
Merhaba @Stan, lütfen kod snippet'ini "ResourceAsColor" Lint'i tetikleyen yöntem çağrısı ile sağlayabilir misiniz?
araks

"int color = ContextCompat.getColor (bu, R.color.orange);" ve sonra "span = new ForegroundColorSpan (color);". Kırmızı ile altı çizili olan kelime, "new ForegroundColorSpan ()" öğesine geçirdiğim "renk" tir.
Stan

1
@MonicaLabbao oh ... üzgünüm, yorumunuzu yanlış anladım! :)
araks

3
ContextCompatApi23 bu marka hatası, size ContextCompat
Webserveis

499

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, dependenciesuygulamanı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


4
Bu doğru cevap olarak seçilmelidir. Çünkü Android Dokümanlar'ın verilen bağlantısında " Başlarken M, döndürülen renk belirtilen Bağlamın teması için biçimlendirilecek "
yazıyor

1
'com.android.support:appcompat-v7:23.0.1' derleyin
G O'Rilla

@G O'Rilla Belgelerde görebileceğiniz gibi, ContextCompatsı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 AppcompatV7cevaba vermemek mantıklı .
Melvin

1
Teşekkürler @Melvin, işte benim örnek: kullanım halinde: int colorTwitterBlue = ContextCompat.getColor (this, R.color.color_twitter_blue); composeTweetAlertDialog.getButton (AlertDialog.BUTTON_NEGATIVE) .setTextColor (colorTwitterBlue); composeTweetAlertDialog.getButton (AlertDialog.BUTTON_POSITIVE) .setTextColor (colorTwitterBlue);
Lara Ruffle Coles

1
@Melvin. Tam olarak ne anlama geliyor 'renk belirtilen Bağlamın temasına göre şekillendirilecek'. Biri gibi geliyor, temaya bağlı olarak aynı renk kimliği için farklı renkler tanımlayabilirsiniz. Bu tam olarak nasıl yapılır?
RobertoCuba

47

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ış getColorAPI 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);

4
Kaynak koduna bakıldığında, destek kitaplığı tam olarak bunu yapar. Ben API> = 21 hedef bu yüzden bu birkaç satır için tam bir kavanoz eklemek istemiyorum. Kullanımdan kaldırılmış çağrının üstüne "// noinspection kullanımdan kaldırma" ekleyerek Android Studio'daki uyarıyı engelleyebileceğinizi unutmayın. Ve bir Uygulama bağlamı değil, bir Etkinlik bağlamı kullanın, aksi takdirde tema bilgilerini kaybedebilirsiniz.
personne3000

2
Bu doğru yanıt olmalıdır, ancak destek kitaplığı geleceğe yönelik daha fazla seçim olabilir, ancak destek kitaplığını dahil etmenizin tek nedeni buysa, bu iki satırı dahil etmeniz daha iyi olur.
anthonymonori

30

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

3
Değişken içeriği nereden geliyor? başlatmam gerekiyor mu? Çalışamıyorum. Bana göre Androind'in daha uzun bir yolu var gibi görünüyor; bir xml kaynağından af renk almak için mücadele ediyorum ne kadar aklımı darbeler !! Vay be
ColdTuna

29

Dışarıdaki tüm Kotlin kullanıcıları için:

context?.let {
    val color = ContextCompat.getColor(it, R.color.colorPrimary)
    // ...
}

Aslında olmalı val color = ContextCompat.getColor(context, R.color.colorPrimary). "İt" değişkeni herhangi bir şey olabilir, ancak bir Bağlam olması gerekir .
Scott Biggs

itbu 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 letve nasıl kullanılacağı hakkında daha fazla bilgi için: kotlinlang.org/docs/reference/scope-functions.html#let
Paul Spiesberger

4

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
    }
}

1

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 ContextCompatyana 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.


1
Tema bağımsız değişkeni olarak null değerini iletirseniz, döndürülen renk geçerli tema için stil EDİLMEZ. Bu yüzden yanlış olabilir.
araks


1

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


0

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.