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

我能做什么?

从Android支持库23开始,
一个新的getColor()方法已被添加到ContextCompat

从官方的JavaDoc描述:

返回与特定资源ID关联的颜色

从M开始,返回的颜色将根据指定的上下文主题进行样式化。

所以, 只要打电话

 ContextCompat.getColor(context, R.color.your_color); 

您可以检查GitHub上的ContextCompat.getColor() 源代码 。

您将需要使用ContextCompat.getColor() ,它是Support V4 Library的一部分(因此它将适用于所有以前的API)。

 ContextCompat.getColor(context, R.color.my_color) 

如果您尚未使用支持库,则需要将以下行添加到应用程序build.gradledependencies数组中(注意: 如果您已经使用了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的棉花糖,许多方法已被弃用。

例如,要获得颜色使用

 ContextCompat.getColor(context, R.color.color_name); 

也得到drawable的使用

 ContextCompat.getDrawable(context, R.drawable.drawble_name); 

为Drawable

 ContextCompat.getDrawable(getApplicationContext(),R.drawable.back_arrow) 

对于颜色

  ContextCompat.getColor(getApplicationContext(),R.color.red) 

最短的答案是:

 ContextCompat.getColor(context, R.color.colorAccent); 

getColor()方法在API 23中已被弃用,并在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); 

您可以使用:

 if (Build.VERSION.SDK_INT >= 23) { return ctx.getColor(R.color.YOURCOLOR); } else { return ctx.getRecources().getColor(R.color.YOURCOLOR); } 

我希望它有帮助。 我在Android棉花糖上进行了testing,结果很奏效。

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return context.getResources().getColor(id, context.getTheme()); } else { return context.getResources().getColor(id); } 

利用这个。它有帮助

使用Android支持库中ResourcesCompatgetColor(Resources, int, Theme)方法。

 int white = new ResourcesCompat().getColor(getResources(), R.color.white, null); 

我认为这反映了比ContextCompatgetColor(Context, int)更好的问题getColor(Context, int)因为你询问了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)) 

即使getColor()在棉花糖中被弃用,也是替代方法
getColor(int, Theme)可用。 它可以用作ContextCompat.getColor(context, R.color.your_color);的替代方法ContextCompat.getColor(context, R.color.your_color);

参考这个更多的信息。

这条路:

 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; }