最近在 Buly 崩溃分析里看到一个之前没见过的异常,异常信息为 Can't convert to color: type=0x2
。详细日志如下:

java.lang.RuntimeException:Unable to start activity ComponentInfo{com.parkingwang.iop/com.parkingwang.iop.home.HomeActivity}: android.view.InflateException: Binary XML file line #79: Error inflating class TextView
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2366)
......
java.lang.UnsupportedOperationException:Can't convert to color: type=0x2
android.content.res.TypedArray.getColor(TypedArray.java:327)
android.graphics.drawable.GradientDrawable.inflate(GradientDrawable.java:970)
android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)
android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)
android.content.res.Resources.loadDrawable(Resources.java:2206)
android.content.res.TypedArray.getDrawable(TypedArray.java:602)
android.widget.TextView.<init>(TextView.java:854)
android.support.v7.widget.AppCompatTextView.<init>(TbsSdkJava)

我在 google 中搜索这个异常信息,在 stackoverflow 上得到了一个答案,地址如下:
https://stackoverflow.com/a/34279007/2673757

I faced the same issue, that was caused by using attributes as a reference to color in xml drawable. As mentioned here on API < 21 you can’t use attrs to color in xml drawable. So only way is to use a reference to a color resource (@color/YOURS_COLOR) or use #RGB format.

意思是,在 API 21(即 Android 5.0) 以下,不支持在 xml 定义的 drawable 里使用属性(像 ?attr/xxx 这一类)来指定颜色。

在这个项目里,之所以会这样使用颜色属性,是因为项目里有一个换肤的需求,而皮肤是内置在应用中的。本来项目中有使用第三方皮肤框架,但是由于有很多新增的 drawable 的颜色都和皮肤有关,采用皮肤框架的方式需要在每个皮肤包项目中也增加相应的 drawable 资源,并且布局里要设置对应的属性,会比较麻烦。考虑到 Android 中的 Theme 可以通过调用 applyStyle(int resId, boolean force) 方法覆盖主题里的属性,那么如果为不同的皮肤定义不同的 style,然后在 Activity 创建时把对应的皮肤 style 覆盖到原来的主题上,在使用的时候直接引用属性就可以减少皮肤相关的代码了。
当时在测试机上试了一下,确定方案可行,但是使用的是 5.0 以上的设备,也没有考虑到 5.0 以下是否兼容,所以才会出此问题。

既然有这个原因,那只能老老实实地把相关代码改成皮肤框架的方案了。

除此之外,在 drawable 资源里通过属性来指定 drawable 在 5.0 以下也是不支持的。如下:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@android:color/white"/><item android:drawable="?attr/selectableItemBackground"/>
</layer-list>

它会报如下的 xml 解析异常:

......
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file
line #8: <item> tag requires a 'drawable' attribute or child tag
defining a drawableat
android.graphics.drawable.LayerDrawable.inflate(LayerDrawable.java:161)at
android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:901)at
android.graphics.drawable.Drawable.createFromXml(Drawable.java:837)at android.content.res.Resources.loadDrawable(Resources.java:2182)at android.content.res.TypedArray.getDrawable(TypedArray.java:601)

关于这类问题的讨论见 https://issuetracker.google.com/issues/36941443 ,也就是,5.0 之前在 xml 定义的 drawable 中,是不支持通过属性引用的方式来指定 color 或 drawable 资源的,这个特性在 5.0 开始才被实现。

在 drawable 资源中使用属性引用的兼容问题相关推荐

  1. android中的shape资源,Android Drawable资源讲解之shape篇

    运用好Android的drawable资源,在开发中就可以减少图片的使用量,这样既缩小了app的体积,也省去了设计图片的时间,而且也容易适配不同的屏幕尺寸. 今天首先来讲讲shape资源的使用. 1. ...

  2. android tools ignore,android tools属性引用

    利用tools命名空间,android studio支持很多XML属性,当构建app时这些属性会被擦除,对APK的大小和运行时行为没有任何影响.请看官网. tools属性大致可以分为三类:1,错误处理 ...

  3. WPF XAML 资源样式模板属性存放位置

    WPF XAML 资源样式模板属性存放位置 原文:WPF XAML 资源样式模板属性存放位置 WPF的XAML 资源申明 类似HTML. 整体来说分3种 1.行类资源样式属性 1.1 行内属性 < ...

  4. 【Android 内存优化】Bitmap 图像尺寸缩小 ( 考虑像素密度、针对从不同像素密度资源中解码对应的 Bitmap 对象 | inDensity | inTargetDensity )

    文章目录 一.像素密度对解码图片的影响 二.不考虑像素密度会导致图片缩小尺寸不准确 三.DisplayMetrics 源码阅读.研究手机资源获取规则 四.像素密度参数设置取值 ( inDensity ...

  5. android获取自定义属性,android 自定义控件中获取属性的三种方式(转)

    第一种方法,直接设置属性值,通过attrs.getAttributeResourceValue拿到这个属性值. (1)在xml文件中设置属性值 android:layout_width="f ...

  6. android开发那些事儿(二)--Drawable资源

    在Android应用中,常常会用到Drawable资源,比如图片资源等,在Android开发中我们是用Drawable类来Drawable类型资源的. Drawable资源一般存储在应用程序目录的\r ...

  7. android 从资源中获取数组

    8.1. 从资源中获取数组 8.1.1.概述 除了在Java代码中定义数组,Android还提供了在资源中定义数组,然后在Java代码中解析资源,从而获取数组的方法. 实际开发中,推荐将数据存放在资源 ...

  8. Iframe用法的详细讲解(属性、透明、自适应高度)和html中滚动条属性设置

    Iframe 用法的详细讲解(属性.透明.自适应高度)和html中滚动条属性设置 scrollbar属性.样式详解 1. overflow内容溢出时的设置(设定被设定对象是否显示滚动条) overfl ...

  9. Swift之常见闭包与defer关键字的使用分析和闭包中的循环引用 | CSDN创作打卡

    一.什么是闭包? 在 Swift 中,可以通过 func 定义一个函数,也可以通过闭包表达式定义一个函数,闭包是一个捕获了上下文的常量或者是变量的函数.闭包(Closures)是自包含的功能代码块,可 ...

最新文章

  1. 牛津大学最新《计算代数拓扑》笔记书
  2. jmeter响应数据Unicode编码转换为汉字
  3. Zookeeper_环境搭建及客户端使用
  4. 移动端分步注册_移动应用程序的可用性测试:分步指南
  5. .Net程序调试与追踪的一些方法
  6. 目前市场上主流服务器厂商,目前市场上流行的串口服务器有哪些功能
  7. WINCE下I/O操作基础
  8. java usecompressedclasspointers_聊聊jvm的CompressedClassSpace
  9. mac升级php后旧版本还在,Mac下更新自带的PHP版本
  10. 开课吧Java课堂:StringBuffer全解,非常详细
  11. spark压缩和序列化相关
  12. MSChart控件在对话框程序(vc2010 MFC)中的错误怎么解决?
  13. HP UNIX下载工具的一个好地方
  14. 软件观念革命-交互设计精髓
  15. xp系统总是弹出宽带连接服务器,XP系统电脑总是弹出拨号连接怎么办-系统城...
  16. python matplotlib 万花筒画板
  17. 地平线4显示与服务器通讯发生错误,地平线4加载失败发生不明错误的解决方法 - 系统家园...
  18. 华为路由器交换机命令汇总-持续更新
  19. [渝粤教育] 南京交通职业技术学院 计算机基础 参考 资料
  20. 考研期间复习时间记录

热门文章

  1. 鸿蒙系统研发投入多少,鸿蒙系统研发投入4000至5000人,已经在华为手机上测试完成...
  2. 弹性盒怎么实现左边图片右边文字_微信图文排版模板如何制作?怎么建一个左边图片右边文字的公众号模板?...
  3. Vue -- 初始化安装时出现run `npm audit fix` to fix them, or `npm audit` for details
  4. UC2005III Beta1l聊天室部分功能介绍
  5. 激活函数设计vhdl_浅谈神经网络中激活函数的设计
  6. 基于Springboot+Mybatis的学校教务管理系统
  7. js Date类型相关(一)——定义指定时间
  8. python 几种android截屏方式的学习与使用
  9. 高性能mysql第三版读书笔记
  10. 分享:如何创建抖音广告流程—3步就搞定