资讯中心

Android 样式和主题

📅 2026/11/4 6:05:19
Android 样式和主题
文章目录Android 样式和主题Style 与 Theme 的区别Style 样式Theme 主题作用于Activity作用于Application 和 ? 和 android 和 attr/ 和 ?android:attr/?和?attr/android?android:attr/Theme常见写法常见主题样式设置Android 样式和主题Style 与 Theme 的区别两者本质上是同一种资源 ——style。区别只在于作用范围与生效方式作用于单个 View 时称样式作用于 Application / Activity / View 树时称主题。主题不是另一种语法而是样式在更大作用域上的应用除控件属性外还能定义窗口属性状态栏、导航栏、窗口背景等以及控件的默认样式。对比项Style 样式Theme 主题使用方式stylestyle/Xxx无android:前缀android:themestyle/XxxManifest 或 View 上作用对象单个 ViewApplication / Activity / 单个 ViewAPI 21及其子 View数量限制一个 View 只能指定一个 style一个界面只有一个生效主题但可逐层覆盖典型属性宽高、边距、gravity、drawable、字号配色、窗口属性、控件默认样式、textAppearance主题的作用域可以逐层覆盖Activity 主题覆盖 Application 主题View 上的android:theme覆盖 Activity 主题。也就是就近原则。代码中使用setTheme()必须在setContentView()之前调用才生效。Style 样式样式是属性宽高、颜色、字号、边距等的集合主要用于 View。一个 View 只能通过style属性指定一个样式样式之间可以用parent继承文字部分还可以再叠加android:textAppearance。定义样式?xml version1.0 encodingutf-8?resources!-- 建议显式继承控件的默认样式否则 AppCompat / Material 控件会丢失 tint 等默认效果 --stylenameRadioButtonStyleparentWidget.AppCompat.CompoundButton.RadioButton!-- LinearLayout 权重均分时宽度必须写 0dp写 wrap_content 会先按内容分配再分剩余空间导致宽度不等 -- item nameandroid:layout_width0dp/item item nameandroid:layout_heightmatch_parent/item item nameandroid:layout_weight1/item item nameandroid:buttonnull/item item nameandroid:drawablePadding10dp/item item nameandroid:gravitycenter/item item nameandroid:textSize16sp/item/style/resources使用样式RadioGroupandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationhorizontalRadioButtonstylestyle/RadioButtonStyleandroid:drawableTopdrawable/homeandroid:texthome/RadioButtonstylestyle/RadioButtonStyleandroid:drawableTopdrawable/findandroid:textfind/RadioButtonstylestyle/RadioButtonStyleandroid:drawableTopdrawable/messageandroid:textmessage//RadioGroupTheme 主题主题是样式在更大作用域上的应用可以作用于 Application、ActivityAPI 21 起还可以作用于单个 View / ViewGroupandroid:theme。主题可以看作是样式的加强版除控件属性外还能定义窗口属性和控件默认样式。作用于Activity定义主题!-- 注意parent 用 Theme.MaterialComponents.* 时必须依赖 com.google.android.material:material 库 否则编译期找不到该主题 --stylenameActivityThemeparentTheme.MaterialComponents.DayNight.DarkActionBaritem namecolorPrimary#FF0000/item !-- MDC 主题的状态栏色是 colorPrimaryVariantcolorPrimaryDark 只对 AppCompat 主题生效 -- item namecolorPrimaryVariant#00FF00/item !-- 强调色AppCompat 用 colorAccentMDC 已废弃改用 colorSecondary -- item namecolorSecondary#0000FF/item !-- 主题里直接写android:textColor /android:textSize 对普通 TextView 无效被默认 textAppearance 覆盖 改默认文字颜色用android:textColorPrimary字号/字体请写 textAppearance 或 style -- item nameandroid:textColorPrimary#FF0000/item/style使用主题activityandroid:name.MainActivityandroid:themestyle/ActivityTheme/作用于Application将刚才的主题放在application标签里applicationandroid:themestyle/ActivityTheme 和 ? 和 android 和 attr/ 和 ?android:attr/表示引用资源默认当前应用自己的包完整形式是[package:]type/namestring/app_name引用本应用的资源id/xxx新建 idandroid:drawable/xxx、com.xxx:type/name指定包名的资源stringnameapp_namehello/stringTextViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textstring/app_name/?和?attr/?表示引用当前主题中的属性值不是资源值主题切换时取值随之变化这是换肤/深色模式的基础?attr/等价于?即?attr/nameColor与?nameColor写法等价都表示取当前主题中nameColor这个属性的值。以下三个是 AppCompat 主题的属性colorPrimary主色如标题默认颜色colorPrimaryDark第二颜色如状态栏颜色colorAccent强调色如 FloatingActionButton 背景色stylenameAppThemeparentTheme.AppCompat.Light.DarkActionBaritem namecolorPrimarycolor/colorPrimary/item item namecolorPrimaryDarkcolor/colorPrimaryDark/item item namecolorAccentcolor/colorAccent/item/styleTextViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textstring/app_nameandroid:textColor?colorPrimaryandroid:textSize24sp/androidandroid表示引用 Android 内置的公开系统资源位于android包。ImageViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:srcandroid:drawable/ic_menu_view/?android:attr/拆成三段理解?android:attr/xxx片段含义?取值方式不是引用资源而是去当前主题里查某个属性的值android:包名这个属性由 Android 框架framework 包定义attr/xxx属性名attr/是固定写法可省略所以?android:attr/textColorPrimary “去当前主题里查 android 包定义的textColorPrimary属性的值”。两种等价写法android:textColor?android:attr/textColorPrimary!-- 完整写法 --android:textColor?android:textColorPrimary!-- 简写等价 --关键点值来自你的主题不是系统常量?android:attr/xxx不是取系统自带的固定值而是查当前主题给这个属性赋了什么值框架只是在attrs.xml里声明了这个属性名。stylenameAppThemeparentTheme.MaterialComponents.DayNight.NoActionBaritem nameandroid:textColorPrimary#333333/item !-- 覆写它 --/styleTextViewandroid:textColor?android:attr/textColorPrimary/!-- 结果 #333333 --换成DayNight主题的夜间模式同一个引用会自动取到夜间的值 —— 这才是?的意义也是换肤/深色模式的基础。和android:的区别android:backgroundandroid:drawable/dialog_holo_light!-- 静态永远是这一张图 --android:background?android:attr/selectableItemBackground!-- 动态随主题变化 --android:→ 指向具体资源文件值固定?android:attr/→ 查主题中的属性值换主题就换结果什么时候加android:前缀规则只有一条引用时的名字必须和主题里item name...完全一致。!-- 主题里带 android: 前缀 → 引用时也带 --itemnameandroid:statusBarColor#000/itemandroid:background?android:attr/statusBarColor!-- 主题里不带前缀AppCompat/MDC 自定义的属性→ 引用时也不带 --itemnamecolorPrimary#f00/itemandroid:textColor?attr/colorPrimaryTheme常见写法注意区分系统主题与库主题带android:style/前缀的是系统内置主题只能在对应 API 及以上使用Theme.AppCompat.*、Theme.MaterialComponents.*来自 androidx 库与系统版本无关可向下兼容。Holo 主题Android 3.0 / 4.0 默认API 11android:style/Theme.Holo.LightMaterial 主题Android 5.0 引入API 21不是 4.0android:style/Theme.Material.LightAppCompat 主题androidx.appcompat 库兼容到 API 14与 5.0 无关Theme.AppCompat.Light.DarkActionBarMaterialDesign 样式Material Components 库需依赖 com.google.android.material:materialTheme.MaterialComponents.Light.NoActionBarMaterial3 样式Material3 库属性命名与 MDC 不同Theme.Material3.DayNight.NoActionBar常见主题样式设置!--应用的主要颜色--itemnamecolorPrimary#ff0000/item!--应用的次要颜色AppCompat 主题用 colorPrimaryDarkMDC 主题用 colorPrimaryVariant写 colorPrimaryDark 不会作用于状态栏--itemnamecolorPrimaryDark#00ff00/item!--默认选中颜色AppCompat 用 colorAccentMDC 已废弃改用 colorSecondary--itemnamecolorAccentcolor/colorAccent/item!--状态栏颜色API21可用--itemnameandroid:statusBarColor#00000000/item!-- 状态栏透明化设为 true 后 android:statusBarColor 失效内容延伸到状态栏下方二者二选一 --itemnameandroid:windowTranslucentStatustrue/item!-- 状态栏文字/图标颜色API23可用建议放在 values-v23/styles.xml 中 --itemnameandroid:windowLightStatusBartrue/item!-- 全屏显示隐藏状态栏 --itemnameandroid:windowFullscreentrue/item!-- 隐藏 TitleAppCompat/MDC 主题用无前缀的 windowNoTitle 系统主题如 android:style/Theme.Material.*要用 android:windowNoTitle。 更简单的方式是直接继承 NoActionBar 系列主题 --itemnamewindowNoTitletrue/item!-- 底部虚拟导航栏颜色API21可用 --itemnameandroid:navigationBarColor#E91E63/item!-- 让底部导航栏半透明并覆盖在 Activity 之上默认falseactivity会居于底部导航栏顶部如果设为truenavigationBarColor 失效 --itemnameandroid:windowTranslucentNavigationtrue/item!--窗口背景推荐只作用于 Activity 窗口不影响子 View --itemnameandroid:windowBackgrounddrawable/ic_launcher_background/item!-- 危险主题中的 android:background 会成为所有 View 的默认背景 覆盖 Button / EditText 等控件的默认样式。想设窗口背景请用上面的 windowBackground --!-- item nameandroid:background#a2a3e2/item --!-- 注意android:screenOrientation 不是主题属性写在主题里完全无效 必须写在 Manifest 中activity android:screenOrientationlandscape / --控件相关!-- button 文字是否全部大写MaterialComponents 的 Button 默认开启由 style 决定可用此属性关闭 --itemnameandroid:textAllCapsfalse/item!-- 主题中直接写 android:textColor 对普通 TextView 无效被控件默认 textAppearance 覆盖 要改默认文字颜色请用下面的 android:textColorPrimary --!-- item nameandroid:textColor#B0C4DE/item --!-- 默认 EditText 输入框字体的颜色 --itemnameandroid:editTextColor#E6E6FA/item!-- RadioButton、CheckBox 等控件禁用时的文字颜色 --itemnameandroid:textColorPrimaryDisableOnly#1C71A9/item!-- 应用的主要文字颜色ActionBar 标题文字默认使用该颜色 --itemnameandroid:textColorPrimary#FFFFFF/item!-- 辅助的文字颜色一般比textColorPrimary的颜色弱一点用于一些弱化的表示 --itemnameandroid:textColorSecondary#C1C1C1/item!-- 以下着色属性有两套前缀写错前缀不会生效 AppCompat / MaterialComponents 主题使用无前缀版本AppCompat 自己定义了同名属性 只有系统主题android:style/Theme.Material.*才使用 android: 前缀 --!-- 控件选中时的颜色默认取 colorAccent(AppCompat) / colorSecondary(MDC) --itemnamecolorControlActivated#FF7F50/item!-- 控件按压时的色调水波纹 --itemnamecolorControlHighlight#FF00FF/item!-- CheckBox、RadioButton、SwitchCompat 等默认状态的颜色 --itemnamecolorControlNormal#FFD700/item!-- 默认按钮的背景颜色 --itemnamecolorButtonNormal#1C71A9/item

看完文章,想为自己的企业也做一次专业网站诊断?

尧图顾问免费为您评估现有网站,并给出建站/改版建议与报价方案。

免费获取方案