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.gradle
的dependencies
数组中(注意: 如果您已经使用了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支持库中ResourcesCompat
的getColor(Resources, int, Theme)
方法。
int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
我认为这反映了比ContextCompat
的getColor(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; }