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

Из ресурсов.

Из ContextCompat AndroidX.

Из службы поддержки ContextCompat

Даже если 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)
            }

Официальная ссылка с сайта developer.android.com

С помощью этого метода, упомянутого выше: 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;
}
Другие вопросы по тегам