Android中shape的solid标签的android:color属性必须引用color资源(如@color/red_500),不可直接写#RRGGBB或引用string/drawable等非color资源,且需配套提供values/values-night中的同名颜色定义以支持深色模式。

android:color 里不能直接写 #RRGGBB
在 shape 的 solid 标签中写 android:color="#FF0000" 看似合理,但实际会编译失败或被忽略——Android 要求颜色值必须是资源引用,不是硬编码字符串。
常见错误现象:Resource not found 或运行时背景变成透明/默认色,Logcat 里可能没报错,但 UI 就是不生效。
- 必须用
@color/red_500这种形式,指向res/values/colors.xml里的定义 - 不能用
@android:color/holo_red_light这类系统色(部分旧 API 不支持,且 Android 12+ 已弃用) - 如果只是临时调试,可以建一个
colors.xml,哪怕只放一行:<color name="debug_bg">#FF4081</color>
shape 中 solid 颜色引用必须是 color 类型资源
android:color 属性只认 color 资源,不接受 drawable、dimen 或字符串资源。哪怕你把 #FF4081 放进 strings.xml,再用 @string/xxx 引用,也会崩溃。
使用场景:自定义按钮背景、卡片分割线、loading 框底色等需要纯色填充的地方。
- 正确路径:
res/values/colors.xml→ 定义<color name="bg_primary">#6200EE</color>→ 在shape中写android:color="@color/bg_primary" - 错误写法:
android:color="@string/bg_color"、android:color="@drawable/white_solid"、android:color="?attr/colorPrimary"(属性引用在shape里不生效) - 注意兼容性:Android 5.0+ 支持
color资源中的 alpha 前缀(如#806200EE),但低于 5.0 会忽略 alpha,建议用alpha单独设或降级处理
XML shape 背景色在深色模式下不会自动切换
如果你只定义了 res/values/colors.xml 里的 @color/bg_surface,它在深色模式下不会变——Android 不会自动根据系统主题切换 color 资源值,除非你手动提供 res/values-night/colors.xml。
容易踩的坑:App 开启深色模式后,原本浅灰背景突然变成纯黑,文字看不清,但开发者以为是代码逻辑问题,其实只是颜色资源没分 night。
- 必须成对提供:
res/values/colors.xml和res/values-night/colors.xml - 两份文件里用相同
name,不同值,例如:<color name="bg_surface">#FFFFFF</color>vs<color name="bg_surface">#121212</color> - 不要试图在同一个
colors.xml里用tools:targetApi="29"或条件表达式——XML 不支持运行时判断
shape 文件里用错根节点导致 color 不生效
很多人复制粘贴时漏掉 shape 的 android:shape 属性,或者误用 selector 当根节点,结果 solid 完全不被解析。
典型错误:新建文件叫 bg_rounded.xml,内容却写成:
<selector xmlns:android="http://schemas.android.com/apk/res/android">\n <item>\n <solid android:color="@color/red_500" />\n </item>\n</selector>——这其实是 selector 的 item,不是独立 shape。
- 纯色背景应直接用
shape根节点:<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> -
android:shape必须指定,常用值:rectangle、oval、line、ring;填错或留空会导致Resources$NotFoundException - 如果真要响应状态(比如按压变色),应该用
selector包裹多个shape,而不是让solid直接出现在selector下
@、多一个 /、错一个目录名,都会静默失效。最稳妥的方式是:先在 colors.xml 定义,再在 drawable shape 里引用,最后在 layout 中用 @drawable/xxx ——别跳步。










