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。
具有多API支持的代码:
if (Build.VERSION.SDK_INT < 23) {
view.setBackgroundColor(getResources().getColor(android.R.color.white));
} else {
view.setBackgroundColor(getContext().getColor(android.R.color.white));
}
使用Android支持库中的getColor(Resources, int, Theme)
的ResourcesCompat
方法。
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)。
tl;博士:
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开始,返回的颜色将针对指定的Context主题设置样式
我不想仅为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 Marshmallow上测试过。有效。
最简短的答案是:
ContextCompat.getColor(context, R.color.colorAccent);
在API 23中不推荐使用getColor()方法,它是在ContextCompat中引入的。在使用ContextCompat使用getColor()方法之前,在build.gradle脚本中添加依赖项,即:
dependencies{
// Other stuff
compile 'com.android.support:support-v4:23.0.0'
}
然后可以使用getColor()方法,如:
int colorcode = ContextCompat.getColor(getApplicationContext(), R.color.your_color);