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

ara*_*aks 686 android android-resources android-mnc android-6.0-marshmallow

Resources.getColor(int id)方法已被弃用.

@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
    return getColor(id, null);
}
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

ara*_*aks 1310

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

它来自官方JavaDoc的描述:

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

从M开始,返回的颜色将针对指定的Context主题设置样式.


所以,请致电:

ContextCompat.getColor(context, R.color.your_color);
Run Code Online (Sandbox Code Playgroud)


您可以ContextCompat.getColor() 在GitHub上查看源代码.

  • ContextCompatApi23这个标记错误引用了你的参考ContextCompat (3认同)

Mel*_*vin 488

TL;博士:

ContextCompat.getColor(context, R.color.my_color)
Run Code Online (Sandbox Code Playgroud)

说明:

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

ContextCompat.getColor(context, R.color.my_color)
Run Code Online (Sandbox Code Playgroud)

如果您尚未使用支持库,则需要将以下行添加到dependencies应用程序内的数组中build.gradle(注意:如果您已经使用了appcompat(V7)库,则它是可选的):

compile 'com.android.support:support-v4:23.0.0' # or any version above
Run Code Online (Sandbox Code Playgroud)

如果您关心主题,则文档指定:

从M开始,返回的颜色将针对指定的Context主题设置样式

  • 这应该是选择的正确答案.因为在Android Docs的给定链接中,它表示"_Starting in`M`,返回的颜色将针对指定的Context主题设置样式." (4认同)

Ale*_*ang 42

我不想仅为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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想代码应该可以正常工作,并且不推荐使用的getColorAPI不能从API <23中消失.

  • 查看源代码,这正是支持库的工作方式.我的目标API> = 21所以我不想为这几行包含一个完整的jar.请注意,您可以通过在不推荐的调用之上添加"// noinspection deprecation"来取消Android Studio中的警告.并使用Activity上下文,而不是Application上下文,否则您可能会丢失主题信息. (4认同)
  • 这应该是正确的答案,虽然支持库可以是更加面向未来的选择,我同意如果这是您包含支持库的唯一原因,那么最好包括这几行. (2认同)

Ash*_*jan 28

在Android Marshmallow中,许多方法都已弃用.

例如,获得颜色使用

ContextCompat.getColor(context, R.color.color_name);
Run Code Online (Sandbox Code Playgroud)

也是为了获得可绘制的用途

ContextCompat.getDrawable(context, R.drawable.drawble_name);
Run Code Online (Sandbox Code Playgroud)

  • 可变上下文来自哪里?我必须初始化吗?我无法正常工作。在我看来,安德鲁因德(Androind)任重而道远。它让我大吃一惊,我为从xml资源中获取af颜色付出了很多努力!!哇 (2认同)

Spi*_*pau 27

对于那里的所有Kotlin用户:

context?.let {
    val color = ContextCompat.getColor(it, R.color.colorPrimary)
    // ...
}
Run Code Online (Sandbox Code Playgroud)


Tar*_*ora 17

对于Drawable

ContextCompat.getDrawable(getApplicationContext(),R.drawable.back_arrow)
Run Code Online (Sandbox Code Playgroud)

对于颜色

 ContextCompat.getColor(getApplicationContext(),R.color.red)
Run Code Online (Sandbox Code Playgroud)


use*_*242 8

您可以使用:

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

在Android Marshmallow上测试过.有效.


Dmi*_*try 8

具有多API支持的代码:

if (Build.VERSION.SDK_INT < 23) {
    view.setBackgroundColor(getResources().getColor(android.R.color.white));
} else {
    view.setBackgroundColor(getContext().getColor(android.R.color.white));
}
Run Code Online (Sandbox Code Playgroud)


Jam*_*mie 8

在 Kotlin 中,您可以执行以下操作:

ContextCompat.getColor(requireContext(), R.color.stage_hls_fallback_snackbar)
Run Code Online (Sandbox Code Playgroud)

如果可以从调用函数的位置访问 requireContext()。我在尝试时遇到错误

ContextCompat.getColor(context, R.color.stage_hls_fallback_snackbar)
Run Code Online (Sandbox Code Playgroud)


Sam*_*ami 7

最简短的答案是:

ContextCompat.getColor(context, R.color.colorAccent);
Run Code Online (Sandbox Code Playgroud)


小智 7

在API 23中不推荐使用getColor()方法,它是在ContextCompat中引入的.在使用ContextCompat使用getColor()方法之前,在build.gradle脚本中添加依赖项,即:

dependencies{

    // Other stuff

    compile 'com.android.support:support-v4:23.0.0'
}
Run Code Online (Sandbox Code Playgroud)

然后可以使用getColor()方法,如:

int colorcode = ContextCompat.getColor(getApplicationContext(), R.color.your_color);
Run Code Online (Sandbox Code Playgroud)


you*_*nes 6

在活动中使用 ContextCompat

ContextCompat.getColor(context, R.color.color_name)
Run Code Online (Sandbox Code Playgroud)

在阿达珀

private Context context;


context.getResources().getColor()
Run Code Online (Sandbox Code Playgroud)