getColor(int id)已废弃,使用带Theme参数的重载实现是否正确?
结论
你当前的适配方案存在两个问题,不能直接作为通用适配方案使用:
- 方法调用方式错误:Android系统的
Activity、Fragment、Context类均未提供双参数的getColor(int id, Theme theme)方法,该方法属于Resources类,你如果直接按示例代码写会编译不通过,正确的原生调用写法应该是getResources().getColor(R.color.green, getContext().getTheme())。 - 没有兼容低版本系统:这个双参数的
getColor方法是API 23(Android 6.0)才新增的,如果你应用的最小兼容版本低于23,在API 22及更低版本的设备上运行会触发方法找不到的崩溃。
正确适配方案
通用适配推荐直接使用AndroidX兼容库提供的ContextCompat.getColor()工具方法,它内部已经做好了版本判断和主题适配,你不需要额外处理兼容逻辑,写法如下:
int greenColor = ContextCompat.getColor(getContext(), R.color.green);
如果你没有引入AndroidX兼容库,可以手动写版本判断逻辑实现适配:
int greenColor; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23及以上使用带主题参数的方法 greenColor = getResources().getColor(R.color.green, getContext().getTheme()); } else { // API 22及以下使用旧版方法 greenColor = getResources().getColor(R.color.green); }
补充说明
你在res/colors.xml中定义的green颜色格式是正确的,#FF00FF00为标准的ARGB八进制写法,适配过程中不需要修改该定义。
内容的提问来源于stack exchange,提问作者marioc
相关产品推荐
相关产品推荐

