Android开发入门:样式和主题(Styles and Themes)

2023-12-04 22:18

本文主要是介绍Android开发入门:样式和主题(Styles and Themes),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这篇文章是官方文档的翻译和笔记。对应于官方文档的develop--API Guides--User Interface--Styles and Themes

文章内容:

0. 样式和主题

1. 定义样式

   1.1 定义样式的步骤

   1.2 继承

   1.3 多层次继承

   1.4 样式属性

2. 为UI使用样式和主题

   2.1 为单个视图使用样式

   2.2 为Activity或应用程序使用主题

   2.3 根据不同平台版本选择主题

3. 使用平台的样式和主题


0. 样式和主题(Styles and Themes)

样式(style)是用来指定视图或窗口的外观和格式的一组属性集合。样式可以用来指定高度、填充、字体大小、背景颜色等等。样式在XML资源文件中定义,和指定布局的XML文件是分开的。

Android中的样式和网页设计中的CSS(级联样式表)践行同样的哲学:将设计和内容分开。

例如,你可以把下面这个布局XML

<TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:textColor="#00FF00"android:typeface="monospace"android:text="@string/hello" />
变成下面这样:

<TextViewstyle="@style/CodeFont"android:text="@string/hello" />
所有和样式相关的属性都从布局文件中移动到了一个名为CodeFont的样式定义中。CodeFont样式的定义会在下文给出。


主题(theme)是应用到整个activity或者应用程序的样式。而不是像上面的例子一样只应用到单个视图。当一个样式变成主题后,Activity或应用程序中的所有视图都将应用这个样式中它所支持的属性。例如,你可以将上面例子中的GodeFont样式作为一个activity的主题,然后这个Activity中所有的文字都将变成monospace字体。


1. 定义样式(Defining Styles)

1.1 创建样式的步骤:

1.在工程的res/values目录下创建一个XML文件。这个XML文件的根节点必须是<resources>。

2.为每一个你要创建的样式创建一个<style>元素。并且用来识别每个<style>的name属性的值必须是独一无二的。

3.为样式的每一个属性创建一个<item>元素,每个<item>都必须有一个name来表示样式属性,一个和name对应的值。这个值可以是关键字字符串、十六进制表示的颜色、对另一个资源类型的引用,或者其他值。

下面是一个只有单个样式的示例文件

<?xml version="1.0" encoding="utf-8"?>
<resources><style name="CodeFont" parent="@android:style/TextAppearance.Medium"><item name="android:layout_width">fill_parent</item><item name="android:layout_height">wrap_content</item><item name="android:textColor">#00FF00</item><item name="android:typeface">monospace</item></style>
</resources>
<resources>的每个子元素在编译期间都会被转化为一个应用程序资源对象。为每一个样式指定name后,IDE会在R文件中为这个样式创建一个ID,以后就可以在布局文件中根据@style/id来引用相应的样式。比如要引用上面定义的样式,可以使用@style/CodeFont。


<style>元素的parent属性是可选的。parent属性用来指定当前样式要继承属性的样式的id(样式之间是可以继承的)。你还可以覆写继承来的属性。


在XML文件中为一个应用程序或者Activity定义一个主题和为一个视图定义一个样式的方式是一模一样的。在上面定义的GodeFont样式即可以作为单个视图的样式,也可以作为一个应用程序或Activity的主题。如何将一个样式应用到一个视图或者整个应用程序或Activity在稍后说明。


1.2 继承

<style>的parent属性可以指定一个你想要继承的属性。你可以继承一个现有的样式然后定义你想要修改或添加的属性。你可以继承你自己定义的属性,也可以继承平台内置的属性。比如,你可以继承Android平台的默认字体外观然后修改它。

<style name="GreenText" parent="@android:style/TextAppearance"><item name="android:textColor">#00FF00</item></style>
如果你要继承自己定义的样式,你不需要使用parent属性,只需要在把你新定义的样式的name的前缀名设为你要继承的属性的name。前缀name和name用点号分开。例如,如果你要定义一个新颜色继承自CodeFont样式,然后把字体颜色设为红色,你可以这样定义这个样式:

<style name="CodeFont.Red"><item name="android:textColor">#FF0000</item></style>
注意:虽然这个样式没有使用parent属性,但是它的name前缀是CodeFont,所以这个演示继承了CodeFont样式的所有属性,但是将text颜色修改成了红色。你可以用@style/CodeFont.Red来引用这个样式。


1.3 多层次继承

只要你愿意,你可以任意扩展继承层次。还是通过name来进行。比如,你可以这样来继承CodeFont.Red:

<style name="CodeFont.Red.Big"><item name="android:textSize">30sp</item></style>
这个样式继承了CodeFont和CodeFont.Red样式所有属性,然后添加了一个android:textSize属性。现在你可以用@/style/CodeFont.Red.Big来引用它。

注意:通过改name来继承样式的方法只适用于你自己定义的样式。想要继承Android内置的样式,你还得用parent属性。


1.4 样式属性

现在你已经知道样式是怎么定义的了,你还得知道在<item>元素中哪些样式属性是可以利用的。你可能已经熟悉了一些,比如layout_width和textColor。还有很多样式属性我们可以使用。

查看一个视图可以支持哪些属性,最好的地方是它对应的class reference,那儿列出了它能支持的所有XML属性。比如,所有在EditText XML attributes表中列出的属性都可以在为EditText定义的样式中使用。其中列出的一个属性是android:inputType,以前你可能在<EditText>元素中使用android:inputType,就像这样:

<EditTextandroid:inputType="number"... />
现在你可以为EditText创建一个样式,来包含这个属性

<style name="Numbers"><item name="android:inputType">number</item>...
</style>
这样你就可以在布局文件中直接引用这个样式,而不是在布局文件中指定inputType属性(记住我们的哲学:设计和内容分开)

<EditTextstyle="@style/Numbers"... />
这个简单例子中,使用样式的方法好像比没使用样式方法多做了一些工作,但是,当你需要很多样式属性时,我们就可以在很多地方重复利用这个定义的样式,这个回报是值得的。(定义一次,多次使用)

想查看所有可能的样式属性,看R.attr  reference。记住,并不是所有的视图对象都支持相同的样式属性,所以你通常应该参考特定视图类型来查看所支持的样式属性。然而,如果你将一个样式应用到一个视图,而这个视图并不支持这个样式中所有属性,视图将只应用它支持的属性,而忽略那些它不支持的属性。


一些样式属性,不适用于任何视图元素,只能应用到主题上。这些样式属性适用于整个窗口而不是任何视图类型。比如,一些主题的样式属性可以隐藏应用标题,隐藏工具栏,或者改变窗口的背景,这些属性就不属于任何视图对象。想查看这些theme-only样式属性,查看R.attr参考中以”window“开通的属性。比如windowNoTitle和windowBackground只有在样式作为主题应用到Activity或整个应用程序时才有效。

     注意:不要忘记<item>中的属性名称都以命名空间android:开头。比如:<item name="android:inputType">



2. 为UI设置样式和主题

2.1 为单个视图设置样式

要为单个视图设置样式,你需要在XML布局文件中找到对应的视图标签,并为之添加sytle属性。

比如,下面的例子为一个TextView设置CodeFont样式。

<TextViewstyle="@style/CodeFont"android:text="@string/hello" />

注意style属性没有用android:前缀


2.2 为Activity或应用程序设置主题

为Activity或应用程序设置主题,你需要在Androidmanifest.xml文件中为<activity>或<application>标签添加android:theme属性。

比如,下面的例子为整个应用程序设置主题:

<application android:theme="@style/CustomTheme">
下面的例子为一个Activity设置主题:

<activity android:theme="@android:style/Theme.Dialog">

就像Android中其他内置资源一样,Android也提供了很多预先定义好的主题供你使用。比如你可以使用内置的Dialog主题来是你的Activity看起来像一个对话框。

<activity android:theme="@android:style/Theme.Dialog">


或者你想让你的Activity背景透明,你可以使用Translucent主题

<activity android:theme="@android:style/Theme.Translucent">


如果你喜欢某个内置主题,但是想做细微的修改,你可以自定义一个主题并继承这内置主题。比如下面这样:

<color name="custom_theme_color">#b0b0ff</color>
<style name="CustomTheme" parent="android:Theme.Light"><item name="android:windowBackground">@color/custom_theme_color</item><item name="android:colorBackground">@color/custom_theme_color</item>
</style>
然后,你就可以在Android Manifest为Activity指定主题了

<activity android:theme="@style/CustomTheme">


2.3 为不同的平台版本选择不同主题

Android的新版本为应用程序提供了新的主题。你可能想在应用程序中使用这些主题,同时又想兼容老的平台版本。你可以利用资源选择参数来做到这一点:在不同的平台版本上使用不同的父主题。

比如,这里有一个自定义主题简单的继承子平台默认的light theme。它可能出现在res/values目录下的一个XML文件中(一般是res/values/stryles.xml):

<style name="LightThemeSelector" parent="android:Theme.Light">...
</style>
想在Android 3.0(API Level 11)或者更高的平台上使用新的全息主题,你可以在res/values-v11目录下为主题创建一个备选的主题,但是保证parent是全息主题( holographic theme可以翻译成全息主题吗?):

<style name="LightThemeSelector" parent="android:Theme.Holo.Light">...
</style>

现在你按照一般的方式使用这个主题,当运行在Android 3.0或者更高的版本时,你的应用程序会自动切换到全息主题。


你可以在R.styleabel.Theme中找到一张关于你能在主题中使用的标准属性表。

想知道更多地关于”根据不同平台版本或其他设备配置提供可选资源,比如如主题和布局“,请查看Providing Resources文档。



3. 使用平台的主题和样式

Android平台提供了一大堆样式和主题,你完全可以在你的应用程序中使用。你可以在R.style class中找到一份关于所有可使用的样式参考。要使用所有在这份参考中列出的样式,你需要将样式name的下划线换成点号。比如,你可以通过”@android:style/Theme.NoTitleBar“来使用这里列出的Theme_NoTitleBar主题。

然而,这份R.stytle 参考并是一份好的文档,而且描述的不全面。但是,通过阅读关于这些样式和主题的真实代码可以让你更好的理解它们提供了哪些属性。想更多低了解Android 样式和主题,请阅读下面的源代码:

  • Android Styles(styles.xml)
  • Android Themes(themes.xml)
这些文件会通过例子来帮助你理解。例如,在Android themes源代码中,你会找到<style name="Theme.Dialog">声明。在这个定义中,你会发现所有用于样式对话框的属性都用于Android框架。

想知道更多关于样式和主题的语法信息,请查看 Style Resource 文档。

想知道你在定义样式或主题时能使用哪些样式属性(例如,"windowBackground"或"textAppearance"),请查看R.attr或者相应的View class。


SEE ALSO

  1. Style and Theme Resources
  2. R.style for Android styles and themes
  3. R.attr for all style attributes


小弟英语刚过四级,若翻译的有错误或不合适的地方,欢迎指出!拜谢!

本来想做笔记,但过程中发现翻译文档更有价值,既能当笔记,也能在翻译的过程中加深理解!




这篇关于Android开发入门:样式和主题(Styles and Themes)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/455098

相关文章

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE