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