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

相关文章

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

HTML5中下拉框<select>标签的属性和样式详解

《HTML5中下拉框<select>标签的属性和样式详解》在HTML5中,下拉框(select标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中选择值的方式,本文将深入探讨select标签的... 在html5中,下拉框(<select>标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.