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

Что я должен делать?

Ответ 1

Начиная с библиотеки поддержки Android 23,
новый метод getColor() был добавлен в ContextCompat.

Его описание с официального JavaDoc:

Возвращает цвет, связанный с конкретным идентификатором ресурса.

Начиная с M, возвращаемый цвет будет стилизован для указанной темы контекста.


Итак, просто позвоните:

ContextCompat.getColor(context, R.color.your_color);


Вы можете проверить исходный код ContextCompat.getColor() на GitHub.

Ответ 2

ТЛ; др:

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, возвращаемый цвет будет стилизован для указанной темы контекста.

Ответ 3

Я не хочу включать библиотеку поддержки только для 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.

Ответ 4

В Android Marshmallow многие методы устарели.

Например, чтобы использовать цвет

ContextCompat.getColor(context, R.color.color_name);

Также для использования с возможностью использования

ContextCompat.getDrawable(context, R.drawable.drawble_name);

Ответ 5

Для всех пользователей Kotlin:

context?.let {
    val color = ContextCompat.getColor(it, R.color.colorPrimary)
    // ...
}

Ответ 6

Для Drawable

ContextCompat.getDrawable(getApplicationContext(),R.drawable.back_arrow)

Для цвета

 ContextCompat.getColor(getApplicationContext(),R.color.red)

Ответ 7

Ты можешь использовать:

if (Build.VERSION.SDK_INT >= 23) {
    return ctx.getColor(R.color.YOURCOLOR);
} else {
    return ctx.getRecources().getColor(R.color.YOURCOLOR);
}

Проверено на Android Зефир. Это сработало.

Ответ 8

Самый короткий ответ:

ContextCompat.getColor(context, R.color.colorAccent);

Ответ 9

Метод 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);

Ответ 10

Код с поддержкой нескольких API:

if (Build.VERSION.SDK_INT < 23) {
    view.setBackgroundColor(getResources().getColor(android.R.color.white));
} else {
    view.setBackgroundColor(getContext().getColor(android.R.color.white));
}

Ответ 11

Используйте 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.

Ответ 12

В 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))    

Ответ 13

Использовать этот:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    return context.getResources().getColor(id, context.getTheme());
} else {
    return context.getResources().getColor(id);
}

Ответ 14

Даже если getColor() устарел в зефире, метод замены
getColor(int, Theme). Что можно использовать в качестве альтернативы ContextCompat.getColor(context, R.color.your_color);

обратитесь к this для получения дополнительной информации.

Ответ 15

Таким образом:

fab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.badge_participants_counter_color)));

Ответ 16

Я тоже расстроился. Моя потребность была очень проста. Все, что я хотел, это цвет 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;
}

Ответ 17

Если вам не нужны ресурсы, используйте parseColor(String):
Color.parseColor("#cc0066")

Ответ 18

С помощью этого метода, упомянутого выше: getColor (context, R.color.your_color); Не понятно, как получить "контекст". Это не сработает, просто поместив контекст в моем случае, Android Studio 3.2. Я считаю, что это работает для меня. .setTextColor(Color.RED).

Ответ 19

В вашем 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
    }
}