升级Gradle与Android构建工具后AAPT样式父类资源错误如何解决?
问题原因
- 升级后切换到AAPT2是核心诱因:AAPT2对样式父类的类型校验比旧版AAPT严格得多,它要求样式的
parent必须直接指向样式资源(格式为@style/xxx),不接受间接引用属性(@android:attr/xxx)作为父类——哪怕这个属性最终指向的是样式,AAPT2也会判定类型不匹配。 - 你的代码里
parent="@android:attr/listViewStyle"是直接引用属性本身,而非属性对应的样式资源,这刚好命中了AAPT2的校验规则,导致编译报错。
解决方案
给你两种靠谱的解决方法,按需选择:
方法1:直接替换为具体的AppCompat样式
既然你用了appcompat-v7,且主题里android:listViewStyle对应的是@style/Widget.AppCompat.ListView.Menu(或者通用的@style/Widget.AppCompat.ListView),直接把parent改成这个具体样式就行:
<style parent="@style/Widget.AppCompat.ListView" name="treeViewListStyle"> <item name="android:background">@android:color/white</item> <item name="android:divider">@drawable/divider</item> </style>
这种写法最直白,完全符合AAPT2的要求,编译不会出问题。
方法2:用主题属性引用(保留主题适配性)
如果想让这个样式自动跟着当前主题里的listViewStyle配置走,别用@android:attr/,换成主题属性引用语法?android:attr/就行,AAPT2认可这种写法(它会解析成主题中该属性对应的样式):
<style parent="?android:attr/listViewStyle" name="treeViewListStyle"> <item name="android:background">@android:color/white</item> <item name="android:divider">@drawable/divider</item> </style>
这种方式能保持样式的主题关联性,适合需要适配不同主题的场景。
内容的提问来源于stack exchange,提问作者user149408
相关产品推荐
相关产品推荐

