在Android 6.0 Marshmallow(API 23)上弃用了getColor(int id)

时间:2015-07-23 14:44:08

标签: android android-resources android-6.0-marshmallow android-mnc

{@ 1}}方法已被弃用。

Resources.getColor(int id)

我该怎么办?

23 个答案:

答案 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

来自ContextCompat AndroidX

来自ContextCompat Support

答案 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.getColorResourcesCompat.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)