样式和主题Android的Styles(样式)和Themes(主题)类似Web开发里的CSS用来定义一组已有属性和对应的值将这组值直接赋给一个组件方便将页面内容和布局呈现分开。Style和Theme在Android里的定义方式是完全一样的两者只是概念上的区别Style用在单个视图或控件上Theme用于Activity或整个应用程序。因为Theme作用范围大所以需要比Style包含更多的定义属性值的项目(item)。Android的Style或Theme与Web的CSS相比只作用于一个对象即只能通过android:themestyle/AppTheme或stylestyle/MyStyle指定一个值。而CSS则可以通过class属性在DOM元素上定义多个样式来达到组合的效果。Style也有CSS没有的功能那就是继承(Inheritance)。(CSS通过LESS和SASS这些工具也获得继承的能力。)引用自定义 Style 时格式固定为style/样式名无需加android:前缀。style的继承方式通过parent属性继承Style通过点连接继承Style通过 “.” 继承只适用与自定义的style继承。Style的成员style中的成员是属性即在style中重写属性值。属性的值通过color等指定或者通过?attr引用其它属性。style和declare-styleable的区别style和declare-styleable是 Android 资源系统中两个用途完全不同的标签核心区别在于style用于定义 UI 外观的集合赋值而declare-styleable用于声明自定义控件可接受的属性列表定义接口。核心区别对比作用不同style是一组属性值的集合用于复用视图的外观设置如颜色、尺寸、字体。它本身不定义新属性而是给已有的属性包括系统属性和自定义属性赋予具体值。declare-styleable用于声明自定义 View 支持哪些 XML 属性。它告诉编译器和系统“这个自定义控件可以接收这些属性”并生成对应的R.styleable数组以便代码读取。文件位置不同style通常定义在res/values/styles.xml中。declare-styleable必须定义在res/values/attrs.xml中且内部包含attr标签。代码引用方式不同style在布局 XML 中通过stylestyle/YourStyleName引用在 Java/Kotlin 中通过context.setTheme()或View.setStyle()间接应用。declare-styleable在 Java/Kotlin 代码中通过context.obtainStyledAttributes(attrs, R.styleable.YourStyleableName)获取TypedArray来解析属性值。关键逻辑关系依赖关系declare-styleable内部引用的attr可以独立存在也可以被包裹其中。若属性被包裹在declare-styleable中系统会为该组属性生成一个整数数组索引R.styleable方便批量读取若未包裹则只能单独通过AttributeSet手动解析无法使用obtainStyledAttributes高效获取。命名空间在布局中使用declare-styleable定义的自定义属性时必须在 XML 根节点声明自定义命名空间如xmlns:apphttp://schemas.android.com/apk/res-auto而style中的属性若为系统属性则无需命名空间若为自定义属性也需命名空间。生成产物style生成R.style资源 ID。declare-styleable生成R.styleable数组及R.attr属性 ID。简单示例xml!-- attrs.xml: 声明自定义控件能接收什么属性 -- declare-styleable nameCustomButton attr namecustomColor formatcolor/ !-- 定义属性 -- /declare-styleable !-- styles.xml: 给属性赋值形成可复用的样式 -- style nameRedButton item namecustomColorandroid:color/holo_red_dark/item !-- 赋值 -- /style总结写自定义 View 时先用declare-styleable定义“我能接受什么参数”再用style配置“这些参数的默认或批量值”。两者配合实现灵活的 UI 定制。