Метод 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, возвращаемый цвет будет стилизован для указанной темы контекста.
Я не хочу включать библиотеку поддержки только для 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)
// ...
}
Для Drawable
ContextCompat.getDrawable(getApplicationContext(),R.drawable.back_arrow)
Для цвета
ContextCompat.getColor(getApplicationContext(),R.color.red)
Ты можешь использовать:
if (Build.VERSION.SDK_INT >= 23) {
return ctx.getColor(R.color.YOURCOLOR);
} else {
return ctx.getRecources().getColor(R.color.YOURCOLOR);
}
Проверено на Android Зефир. Это сработало.
Самый короткий ответ:
ContextCompat.getColor(context, R.color.colorAccent);
Метод getColor() устарел в API 23 и был введен в ContextCompat. Прежде чем использовать метод getColor() с помощью ContextCompat, добавьте зависимости в build.gradle script, который:
dependencies{
// Other stuff
compile 'com.android.support:support-v4:23.0.0'
}
Затем метод getColor() может использоваться как:
int colorcode = ContextCompat.getColor(getApplicationContext(), R.color.your_color);
Код с поддержкой нескольких API:
if (Build.VERSION.SDK_INT < 23) {
view.setBackgroundColor(getResources().getColor(android.R.color.white));
} else {
view.setBackgroundColor(getContext().getColor(android.R.color.white));
}
Используйте 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
.
В 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))
Использовать этот:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return context.getResources().getColor(id, context.getTheme());
} else {
return context.getResources().getColor(id);
}
Даже если getColor()
устарел в зефире, метод замены getColor(int, Theme)
. Что можно использовать в качестве альтернативы ContextCompat.getColor(context, R.color.your_color);
обратитесь к this для получения дополнительной информации.
Таким образом:
fab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.badge_participants_counter_color)));
Я тоже расстроился. Моя потребность была очень проста. Все, что я хотел, это цвет 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;
}
Если вам не нужны ресурсы, используйте parseColor(String)
: Color.parseColor("#cc0066")
С помощью этого метода, упомянутого выше: getColor (context, R.color.your_color); Не понятно, как получить "контекст". Это не сработает, просто поместив контекст в моем случае, Android Studio 3.2. Я считаю, что это работает для меня. .setTextColor(Color.RED).
В вашем 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
}
}