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 回答
具有多API支持的代码:
从Android支持库23开始,
ContextCompat
添加了一个新的getColor()方法 .它来自官方JavaDoc的描述:
那么, just call :
你可以查看
ContextCompat.getColor()
source code on GitHub .TL;博士:
说明:
您将需要使用ContextCompat.getColor(),它是Support V4库的一部分(它适用于所有以前的API) .
如果您还没有使用支持库,则需要将以下行添加到应用程序
build.gradle
中的dependencies
数组中(注意:如果您已经使用了appcompat(V7)库,则它是可选的):如果您关心主题,则文档指定:
我不想仅为getColor包含支持库,所以我使用的是类似的东西
我想代码应该可以正常工作,不推荐的
getColor
不能从API <23消失 .在Android Marshmallow中,许多方法都已弃用 .
例如,获得颜色使用
也是为了获得可绘制的用途
对于那里的所有Kotlin用户:
对于Drawable
对于颜色
您可以使用:
在Android Marshmallow上测试过 . 有效 .
最简短的答案是:
在API 23中不推荐使用getColor()方法,它是在ContextCompat中引入的 . 在使用ContextCompat使用getColor()方法之前,在build.gradle脚本中添加依赖项,即:
然后可以使用getColor()方法,如:
使用Android支持库中
ResourcesCompat
的getColor(Resources, int, Theme)
方法 .我认为这比
ContextCompat
的getColor(Context, int)
更好地反映了你的问题,因为你问的是Resources
. 在API级别23之前,将不会应用主题,并且方法将调用getColor(int)
,但您不会使用已弃用的警告 . 主题也可能是null
.在Mono / xamarin.android中我遇到了同样的问题,以下代码完美地运行:
在我的情况下,上下文是我的活动(Android.Support.V7.App.AppCompatActivity)所以我的实际用例是:
用这个:
即使_285907_在棉花糖中被弃用,也就是替换方法
getColor(int, Theme)
可用 . 哪个可以作为ContextCompat.getColor(context, R.color.your_color);
的替代品有关更多信息,请参阅this .
如果您不一定需要资源,请使用parseColor(String):
Color.parseColor("#cc0066")
这条路:
我也很沮丧 . 我的需要非常简单 . 我想要的只是来自资源的ARGB颜色,所以我写了一个简单的静态方法 .