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 .
ТЛ; др:
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, возвращаемый цвет будет стилизован для указанной темы контекста.
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.
И вот что я использую в 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);
В 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, не является ли NULL. Функция 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. До уровня API 23 тема не будет применена, и метод вызывается, 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))
Из ресурсов .
Я тоже расстроился. Моя потребность была очень простой. Все, что я хотел, это цвет 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;
}