getColor适配方案

最近也是线上出了一个问题Context.getColor方法找不到!!,查了一下,原来这个方法需要添加版本适配。现在系统讲一下这个问题,记录一下自己犯错的地方,以前欠下的债,迟早要还的。
在6.0系统之后getResources().getColor() 方法上添加了Deprecated 过期注解,也就是说之后的版本不推荐使用这个方法了,他给出的解决办法是getColor(int, Theme)这个方法。

getColor(@ColorRes int id)
  /**
 * Returns a color integer associated with a particular resource ID. If the
 * resource holds a complex {@link ColorStateList}, then the default color
 * from the set is returned.
 *
 * @param id The desired resource identifier, as generated by the aapt
 *           tool. This integer encodes the package, type, and resource
 *           entry. The value 0 is an invalid identifier.
 *
 * @throws NotFoundException Throws NotFoundException if the given ID does
 *         not exist.
 *
 * @return A single color value in the form 0xAARRGGBB.
 * @deprecated Use {@link #getColor(int, Theme)} instead.
 */
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
    return getColor(id, null);
}
  /**
 * Returns a themed color integer associated with a particular resource ID.
 * If the resource holds a complex {@link ColorStateList}, then the default
 * color from the set is returned.
 *
 * @param id The desired resource identifier, as generated by the aapt
 *           tool. This integer encodes the package, type, and resource
 *           entry. The value 0 is an invalid identifier.
 * @param theme The theme used to style the color attributes, may be
 *              {@code null}.
 *
 * @throws NotFoundException Throws NotFoundException if the given ID does
 *         not exist.
 *
 * @return A single color value in the form 0xAARRGGBB.
 */
@ColorInt
public int getColor(@ColorRes int id, @Nullable Theme theme) throws NotFoundException {
    final TypedValue value = obtainTempTypedValue();
    try {
        final ResourcesImpl impl = mResourcesImpl;
        impl.getValue(id, value, true);
        if (value.type >= TypedValue.TYPE_FIRST_INT
                && value.type <= TypedValue.TYPE_LAST_INT) {
            return value.data;
        } else if (value.type != TypedValue.TYPE_STRING) {
            throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id)
                    + " type #0x" + Integer.toHexString(value.type) + " is not valid");
        }

        final ColorStateList csl = impl.loadColorStateList(this, value, id, theme);
        return csl.getDefaultColor();
    } finally {
        releaseTempTypedValue(value);
    }
}

另外还有一个可以获取颜色的方法Context.getColor(),发现他最根本的还是调用getColor(int, Theme)这个方法,而且也是可以正常使用的,没有添加Deprecated 过期注解,本来想着那就拿来用吧,发现这里居然买了一个坑。

:这个方法没有添加任何的版本说明,其实这个方法是在sdk 23(6.0)添加上的,之前的版本是没有这个方法的,你可以想象到了吧,如果不添加任何的版本兼容,直接使用Context.getColor(),6.0之后的系统没有任何问题,但是6.0之前的系统就直接报错退出了,我刚好就踩在了这个坑上。哎,说多了都是泪!!

getColor(@ColorRes int id)
  /**
 * Returns a color associated with a particular resource ID and styled for
 * the current theme.
 *
 * @param id The desired resource identifier, as generated by the aapt
 *           tool. This integer encodes the package, type, and resource
 *           entry. The value 0 is an invalid identifier.
 * @return A single color value in the form 0xAARRGGBB.
 * @throws android.content.res.Resources.NotFoundException if the given ID
 *         does not exist.
 */
@ColorInt
public final int getColor(@ColorRes int id) {
    return getResources().getColor(id, getTheme());
}

好了,现在来说一下解决办法了,看了上面的都知道要怎么解决这个问题,添加sdk 版本判断就可以了,是的
但是个人写的话,就会比较麻烦,所以Google在support 包中提供了一个统一的解决办法:

ContextCompat.getColor(@NonNull Context context, @ColorRes int id)

最重要的:增加 Deprecated 过期注解检测,把一些过期的方法检测出来,并且使用适配的处理办法,解决问题

你可能感兴趣的:(getColor适配方案)