美文网首页
getColor适配方案

getColor适配方案

作者: BlackJava | 来源:发表于2018-09-06 10:30 被阅读202次

    最近也是线上出了一个问题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适配方案

          本文链接:https://www.haomeiwen.com/subject/iymtgftx.html