Resources.getColor(int id)
Метод є застарілим.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Що я повинен зробити?
Resources.getColor(int id)
Метод є застарілим.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Що я повинен зробити?
Відповіді:
Починаючи з бібліотеки підтримки Android 23,
до нього додано новий метод getColor ()ContextCompat
.
Його опис з офіційного JavaDoc:
Повертає колір, пов'язаний з конкретним ідентифікатором ресурсу
Починаючи з M, повернений колір буде стилізований до заданої теми контексту.
Отже, просто зателефонуйте :
ContextCompat.getColor(context, R.color.your_color);
Ви можете перевірити ContextCompat.getColor()
вихідний код на GitHub .
tl; dr:
ContextCompat.getColor(context, R.color.my_color)
Пояснення:
Вам потрібно буде використовувати ContextCompat.getColor () , який є частиною бібліотеки підтримки V4 (він буде працювати для всіх попередніх API).
ContextCompat.getColor(context, R.color.my_color)
Якщо ви вже не використовуєте Бібліотеку підтримки, вам потрібно буде додати наступний рядок до dependencies
масиву всередині додатка build.gradle
(зверніть увагу: це необов'язково, якщо ви вже використовуєте бібліотеку appcompat (V7) ):
compile 'com.android.support:support-v4:23.0.0' # or any version above
Якщо вам важлива тема, у документації зазначено, що:
Починаючи з M, повернений колір буде стилізований до заданої теми контексту
M
, що повертається колір буде стиль для теми зазначеного контексту ст. »
ContextCompat
клас походить від SupportV4. AppcompatV7 також працює, оскільки покладається на SupportV4. Як говориться в документації бібліотеки підтримки , 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.
. Тож є сенс не ставити AppcompatV7
у відповідь.
Я не хочу включати бібліотеку підтримки лише для getColor , тому я використовую щось на зразок
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);
}
}
Я думаю, що код повинен працювати чудово, і застарілий не getColor
може зникнути з API <23.
І ось що я використовую в Котліні:
/**
* 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 багато методів застаріли.
Наприклад, для використання кольору
ContextCompat.getColor(context, R.color.color_name);
Також отримати драматичне використання
ContextCompat.getDrawable(context, R.drawable.drawble_name);
Для всіх користувачів Kotlin там:
context?.let {
val color = ContextCompat.getColor(it, R.color.colorPrimary)
// ...
}
val color = ContextCompat.getColor(context, R.color.colorPrimary)
. Змінна "вона" може бути будь-якою, але вона повинна бути контекстом .
it
в цьому випадку це context
, оскільки я використовую, context?.let {
щоб перевірити, чи context
не є нульовим. Функція getColor()
приймає лише ненульовий контекст. Детальніше читайте тут про let
та як ним користуватися: kotlinlang.org/docs/reference/scope-functions.html#let
У вашому RecyclerView у Котліні
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
}
}
Скористайтеся getColor(Resources, int, Theme)
методом з ResourcesCompat
бібліотеки підтримки Android.
int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
Я думаю, що це краще відображає ваше питання, ніж те, getColor(Context, int)
з тих ContextCompat
пір, про яке ви питаєте Resources
. До рівня 23 інтерфейсу API тема не застосовуватиметься, і метод викликає, getColor(int)
але ви не будете мати застаріле попередження. Тема також може бути null
.
Якщо вам не обов'язково потрібні ресурси, використовуйте parseColor(String)
:
Color.parseColor("#cc0066")
Якщо ваш поточний хв. Рівень API - 23, ви можете просто використовувати так,getColor()
як ми використовуємо для отримання рядкових ресурсів getString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()
Ви можете обмежити рівні API нижче 23:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
але щоб це було просто, ви можете зробити наступне, як прийнята відповідь:
textView.setTextColor(ContextCompat.getColor(context, R.color.green))
З ресурсів .
Від ContextCompat AndroidX .
Я теж розчарувався. Моя потреба була дуже очевидною. Все, що я хотів, - це колір ARGB з ресурсів, тому я написав простий статичний метод.
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;
}