getColor(int id) устарел в Android 6.0 Marshmallow (API 23)
Resources.getColor(int id)
метод устарел.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Что я должен делать?
24 ответа
Начиная с библиотеки поддержки Android 23,
новый метод getColor() был добавлен в ContextCompat
,
Его описание с официального JavaDoc:
Возвращает цвет, связанный с конкретным идентификатором ресурса.
Начиная с M, возвращаемый цвет будет стилизован для указанной темы контекста.
Итак, просто позвоните:
ContextCompat.getColor(context, R.color.your_color);
Вы можете проверить ContextCompat.getColor()
Исходный код на GitHub.
ТЛ; др:
ContextCompat.getColor(context, R.color.my_color)
Объяснение:
Вам нужно будет использовать ContextCompat.getColor (), который является частью библиотеки Support 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, возвращаемый цвет будет стилизован для указанной темы контекста.
Я не хочу включать библиотеку поддержки только для 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.
В 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)
// ...
}
Для рисования
ContextCompat.getDrawable(getApplicationContext(),R.drawable.back_arrow)
Для цвета
ContextCompat.getColor(getApplicationContext(),R.color.red)
В Котлине вы можете:
ContextCompat.getColor(requireContext(), R.color.stage_hls_fallback_snackbar)
если requireContext() доступен из того места, где вы вызываете функцию. Я получал ошибку при попытке
ContextCompat.getColor(context, R.color.stage_hls_fallback_snackbar)
Ты можешь использовать:
if (Build.VERSION.SDK_INT >= 23) {
return ctx.getColor(R.color.YOURCOLOR);
} else {
return ctx.getRecources().getColor(R.color.YOURCOLOR);
}
Проверено на Android Зефир. Это сработало.
Метод getColor() устарел в API 23 и был представлен в ContextCompat. Перед использованием метода getColor() с использованием ContextCompat добавьте зависимости в сценарий build.gradle, который:
dependencies{
// Other stuff
compile 'com.android.support:support-v4:23.0.0'
}
Тогда метод getColor() можно использовать так:
int colorcode = ContextCompat.getColor(getApplicationContext(), R.color.your_color);
Самый короткий ответ:
ContextCompat.getColor(context, R.color.colorAccent);
в действии используется ContextCompat
ContextCompat.getColor(context, R.color.color_name)
в Адапере
private Context context;
context.getResources().getColor()
В вашем 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
}
}
Код с поддержкой нескольких API:
if (Build.VERSION.SDK_INT < 23) {
view.setBackgroundColor(getResources().getColor(android.R.color.white));
} else {
view.setBackgroundColor(getContext().getColor(android.R.color.white));
}
Использовать этот:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return context.getResources().getColor(id, context.getTheme());
} else {
return context.getResources().getColor(id);
}
В Mono / xamarin.android у меня была та же проблема, и следующий код работал отлично:
ContextCompat.GetColor (context, Resource.Color.myColor)
В моем случае контекст - это моя деятельность (Android.Support.V7.App.AppCompatActivity), поэтому пример реального использования:
var color = new Android.Graphics.Color(ContextCompat.GetColor(this, Resource.Color.myColor))
Использовать getColor(Resources, int, Theme)
метод ResourcesCompat
из библиотеки поддержки Android.
int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
Я думаю, что это лучше отражает ваш вопрос, чем getColor(Context, int)
из ContextCompat
так как вы спрашиваете о Resources
, До уровня API 23 тема не будет применена, а метод вызывает getColor(int)
но у вас не будет устаревшего предупреждения. Тема также может быть null
,
Лучшим эквивалентом является использование
ContextCompat.getColor
и
ResourcesCompat.getColor
. Я сделал несколько функций расширения для быстрой миграции:
@ColorInt
fun Context.getColorCompat(@ColorRes colorRes: Int) = ContextCompat.getColor(this, colorRes)
@ColorInt
fun Fragment.getColorCompat(@ColorRes colorRes: Int) = activity!!.getColorCompat(colorRes)
@ColorInt
fun Resources.getColorCompat(@ColorRes colorRes: Int) = ResourcesCompat.getColor(this, colorRes, null)
Если ваш текущий мин. Уровень 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))
Из ресурсов.
Даже если getColor()
устарел в зефире, метод заменыgetColor(int, Theme)
доступен. Который может быть использован в качестве альтернативы ContextCompat.getColor(context, R.color.your_color);
обратитесь к этому для получения дополнительной информации.
Если вам не нужны ресурсы, используйте parseColor(String)
: Color.parseColor("#cc0066")
Сюда:
fab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.badge_participants_counter_color)));
getColor(int)
: этот метод устарел на уровне API 23. ИспользуйтеgetColor(int, android.content.res.Resources.Theme)
вместо.
Моя попытка
minSDK = 21
:
if(Build.VERSION.SDK_INT < 23) {
resources.getColor(R.color.rippelColor, null)
} else {
resources.getColor(R.color.rippelColor)
}
С помощью этого метода, упомянутого выше: getColor(context, R.color.your_color); Не понятно, как получить "контекст". Это не сработает, просто поместив контекст в моем случае, Android Studio 3.2. Я считаю, что это работает для меня. .setTextColor(Color.RED).
Я тоже расстроился. Моя потребность была очень простой. Все, что я хотел, это цвет 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;
}