{@ 1}}方法已被弃用。
Resources.getColor(int id)
我该怎么办?
答案 0 :(得分:1252)
从Android支持库23开始,
已向ContextCompat
添加了新的getColor()方法。
来自官方JavaDoc的描述:
返回与特定资源ID
关联的颜色从M开始,返回的颜色将针对指定的Context主题设置样式。
所以,只需致电:
ContextCompat.getColor(context, R.color.your_color);
您可以查看ContextCompat.getColor()
source code on GitHub。
答案 1 :(得分:469)
TL; DR:
ContextCompat.getColor(context, R.color.my_color)
说明:
您需要使用ContextCompat.getColor(),它是支持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开始,将为指定的样式设置返回的颜色样式 上下文的主题
答案 2 :(得分:39)
我不想仅为 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。
答案 3 :(得分:28)
在Android Marshmallow中,许多方法都已弃用。
例如,获取颜色
ContextCompat.getColor(context, R.color.color_name);
也可以使用
ContextCompat.getDrawable(context, R.drawable.drawble_name);
答案 4 :(得分:22)
对于那里的所有Kotlin用户:
@ViewChild('f')
scopeform: NgForm;
答案 5 :(得分:17)
对于Drawable
ContextCompat.getDrawable(getApplicationContext(),R.drawable.back_arrow)
对于颜色
ContextCompat.getColor(getApplicationContext(),R.color.red)
答案 6 :(得分:8)
您可以使用:
if (Build.VERSION.SDK_INT >= 23) {
return ctx.getColor(R.color.YOURCOLOR);
} else {
return ctx.getRecources().getColor(R.color.YOURCOLOR);
}
在Android Marshmallow上测试过。它奏效了。
答案 7 :(得分:7)
最简短的答案是:
ContextCompat.getColor(context, R.color.colorAccent);
答案 8 :(得分:7)
在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);
答案 9 :(得分:5)
具有多API支持的代码:
if (Build.VERSION.SDK_INT < 23) {
view.setBackgroundColor(getResources().getColor(android.R.color.white));
} else {
view.setBackgroundColor(getContext().getColor(android.R.color.white));
}
答案 10 :(得分:4)
在Kotlin中,您可以执行以下操作:
ContextCompat.getColor(requireContext(), R.color.stage_hls_fallback_snackbar)
如果在调用函数的位置可以访问requireContext()。尝试时出现错误
ContextCompat.getColor(context, R.color.stage_hls_fallback_snackbar)
答案 11 :(得分:3)
在活动中使用了 ContextCompat
ContextCompat.getColor(context, R.color.color_name)
在 Adaper 中
private Context context;
context.getResources().getColor()
答案 12 :(得分:2)
使用此:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return context.getResources().getColor(id, context.getTheme());
} else {
return context.getResources().getColor(id);
}
答案 13 :(得分:2)
在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))
答案 14 :(得分:2)
您当前的分钟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))
来自Resources。
答案 15 :(得分:2)
使用Android支持库中getColor(Resources, int, Theme)
的{{1}}方法。
ResourcesCompat
我认为,与int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
的{{1}}相比,您提出的问题更好,因为您询问getColor(Context, int)
。在API级别23之前,将不会应用主题,并且方法会调用ContextCompat
,但您不会使用已弃用的警告。主题也可能是Resources
。
答案 16 :(得分:1)
即使在棉花糖中弃用getColor()
,替换方法为
getColor(int, Theme)
可用。哪个可以用作ContextCompat.getColor(context, R.color.your_color);
请参阅this以获取更多信息。
答案 17 :(得分:0)
我也很沮丧。我的需要非常简单。我想要的只是来自资源的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;
}
答案 18 :(得分:0)
如果您不一定需要资源,请使用parseColor(String)
:
Color.parseColor("#cc0066")
答案 19 :(得分:0)
这样:
fab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.badge_participants_counter_color)));
答案 20 :(得分:0)
使用上述方法:getColor(context,R.color.your_color);目前尚不清楚如何获得“上下文”。仅将上下文放在我的情况下(android studio 3.2)不能工作。我觉得这很适合我。 .setTextColor(Color.RED)。
答案 21 :(得分:0)
在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
}
}
答案 22 :(得分:0)
最好的等价物是使用 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)