不能,layer-list 中的 android:id 在代码中不可用,因其属于 view 属性而 layer-list 是 drawable 资源,解析时被忽略且不生成 r.id 引用;需通过 layerdrawable 索引获取图层并强制类型转换操作。

layer-list 中的 android:id 能不能在代码里用?
不能直接通过 findViewById() 或类似方式获取 layer-list 里的某个 <item></item> —— 它们不是 View,只是 Drawable 的内部结构。XML 中写的 android:id 在运行时不会注册为可查找的资源 ID,也不会生成 R.id 引用。
想动态改 layer-list 里某一层的颜色/图片,该怎么做?
必须先拿到整个 LayerDrawable 对象,再用索引定位图层(getDrawable(int index)),然后 cast 成具体类型操作。ID 没法用,只能靠顺序或命名约定来管理图层位置。
-
LayerDrawable的图层顺序和 XML 中<item></item>出现顺序严格一致,第一个<item></item>索引是 0 - 如果要改颜色,且该层是
ColorDrawable,就((ColorDrawable) drawable).setColor(...) - 如果要换图,且该层是
BitmapDrawable或InsetDrawable等,得替换成新 Drawable 并调用mutate()防止共享状态 - 修改后需调用
invalidateSelf()触发重绘(尤其在自定义 View 或 Drawable 回调中)
为什么给 <item></item> 加 android:id 看起来没报错却无效?
因为 android:id 是 View 系统的属性,而 layer-list 是 Drawable 资源,解析时会忽略这个属性(不报错但也不存、不暴露)。你能在 XML 里写,纯属 schema 宽松,不代表它被实现。
- ADT / Android Studio 不校验
layer-list子项是否支持android:id - 构建时 aapt 会照单全收,但
Resources.getDrawable()返回的LayerDrawable实例里查不到任何 ID 映射 - 试图用
R.id.xxx引用这个 ID 会导致编译失败:它根本没进 R 文件
有没有更可控的替代方案?
真要按“逻辑名称”操作图层,推荐两种实际可行的做法:
- 在
layer-list外包一层StateListDrawable或自定义Drawable类,在构造时用字段记住各子 Drawable 的引用 - 把图层拆成独立 Drawable 资源(如
@drawable/layer_bg,@drawable/layer_stroke),在代码里分别加载、组合成LayerDrawable,这样每个部分都可单独替换 - 使用
GradientDrawable+ShapeDrawable组合替代复杂layer-list,它们本身支持 setter 方法,比靠索引安全得多
靠 XML ID 管理图层是个常见误解,真正落地时索引容易错位,资源拆分或封装才是稳定路径。










