Resources.getColor(int id)
方法已被弃用。
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
我应该怎么办?
从 Android 支持库 23 开始,
一个新的 getColor() 方法已添加到 ContextCompat
。
它来自官方 JavaDoc 的描述:
返回与特定资源 ID 关联的颜色 从 M 开始,返回的颜色将针对指定的 Context 的主题进行样式设置。
所以,只需调用:
ContextCompat.getColor(context, R.color.your_color);
您可以检查 ContextCompat.getColor()
source code on GitHub。
tl;博士:
ContextCompat.getColor(context, R.color.my_color)
解释:
您将需要使用 ContextCompat.getColor(),它是 Support V4 库的一部分(它适用于所有以前的 API)。
ContextCompat.getColor(context, R.color.my_color)
如果您尚未使用支持库,则需要将以下行添加到应用程序 build.gradle
内的 dependencies
数组中(注意:如果您已使用 appcompat (V7) 库,则它是可选的< /em>):
compile 'com.android.support:support-v4:23.0.0' # or any version above
如果您关心主题,文档会指定:
从 M 开始,返回的颜色将为指定的 Context 的主题设置样式
M
开始,返回的颜色将为指定的 Context 的主题设置样式。”
ContextCompat
类来自 SupportV4。 AppcompatV7 也可以工作,因为它依赖于 SupportV4。正如他们在 Support Library documentation 上所说的,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”可以是任何东西,但它必须是一个上下文。
it
在本例中是 context
,因为我使用 context?.let {
来检查 context
是否不为空。函数 getColor()
只接受非空上下文。在此处阅读有关 let
及其使用方法的更多信息:kotlinlang.org/docs/reference/scope-functions.html#let
在 Kotlin 中,您可以执行以下操作:
ContextCompat.getColor(requireContext(), R.color.stage_hls_fallback_snackbar)
如果 requireContext() 可以从您调用该函数的位置访问。尝试时出现错误
ContextCompat.getColor(context, R.color.stage_hls_fallback_snackbar)
在活动中使用 ContextCompat
ContextCompat.getColor(context, R.color.color_name)
在阿达珀
private Context context;
context.getResources().getColor()
在 Kotlin 的 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 级别为 23,您可以像我们使用 getString()
一样简单地使用 getColor()
来获取字符串资源:
//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()
您可以限制低于 23 的 API 级别:
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))
从 Resources。
使用 Android 支持库中 ResourcesCompat
的 getColor(Resources, int, Theme)
方法。
int white = ResourcesCompat.getColor(getResources(), R.color.white, null);
我认为它比 ContextCompat
的 getColor(Context, int)
更能反映您的问题,因为您询问的是 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)
我也很沮丧。我的需求非常简单。我想要的只是资源中的 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;
}