第十四章:样式(Style)和主题(Theme)
简介
Android的样式(Style)和主题(Theme)文件就好比WEB开发中的CSS一样,可以实现UI界面的风格统一管理,这和Windows平台的XAML格式(Silverlight、WPF)类似。比如我们遇到特殊的节日我们只需变更我们的Style和Theme就可以切换一种新的Style和Theme。还有现有的一些应用提供我们可以自定义UI风格,就是应用的这个原理。Android的主题样式文件存储在res\values目录下,如res\values\styles.xml。
样式(Style)
Style我们可以应用到单个组件或者一类组件,比如我们可以设置组件的字体、颜色等。
下面的文件就是Android SDK(Version16)提供的一个Style文件片段(详细文件在:\android-sdk\platforms\android-16\data\res\values\styles.xml),如下所示我们可以看到系统的各个控件的默认的样式风格
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Global Theme Styles -->
<eat-comment /> <style name="WindowTitleBackground">
<item name="android:background">@android:drawable/title_bar</item>
</style> <style name="WindowTitle">
<item name="android:singleLine">true</item>
<item name="android:textAppearance">@style/TextAppearance.WindowTitle</item>
<item name="android:shadowColor">#BB000000</item>
<item name="android:shadowRadius">2.75</item>
</style> <style name="Widget.EditText">
<item name="android:focusable">true</item>
<item name="android:focusableInTouchMode">true</item>
<item name="android:clickable">true</item>
<item name="android:background">?android:attr/editTextBackground</item>
<item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item>
<item name="android:textColor">?android:attr/editTextColor</item>
<item name="android:gravity">center_vertical</item>
</style> <style name="Widget.ExpandableListView" parent="Widget.ListView">
<item name="android:groupIndicator">@android:drawable/expander_group</item>
<item name="android:indicatorLeft">?android:attr/expandableListPreferredItemIndicatorLeft</item>
<item name="android:indicatorRight">?android:attr/expandableListPreferredItemIndicatorRight</item>
<item name="android:childDivider">@android:drawable/divider_horizontal_dark_opaque</item>
</style> <style name="Widget.ImageButton">
<item name="android:focusable">true</item>
<item name="android:clickable">true</item>
<item name="android:scaleType">center</item>
<item name="android:background">@android:drawable/btn_default</item>
</style> <style name="Widget.WebView">
<item name="android:focusable">true</item>
<item name="android:focusableInTouchMode">true</item>
<item name="android:scrollbars">horizontal|vertical</item>
</style> <style name="Widget.Gallery">
<item name="android:fadingEdge">none</item>
<item name="android:gravity">center_vertical</item>
<item name="android:spacing">-20dip</item>
<item name="android:unselectedAlpha">0.85</item>
</style> <style name="Widget.PopupWindow">
<item name="android:popupBackground">@android:drawable/editbox_dropdown_background_dark</item>
<item name="android:popupAnimationStyle">@android:style/Animation.PopupWindow</item>
</style> <!-- Default
我们可以看到Style文件的跟元素像其他资源文件一样是:<resources> ,样式文件内部由多个的<style>节点构成,每一个style构成一个样式,样式还可以继承。如下所示,指定了样式名称已经其父样式的名称:
<style name="Widget.ExpandableListView" parent="Widget.ListView">
当然如果子样式定义的属性在父样式中存在,那么子样式将会覆盖父样式。
比如我们可以定义如下的样式:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<!-- 定义一个样式,指定字体大小、字体颜色 -->
<style name="style1">
<item name="android:textSize">20sp</item>
<item name="android:textColor">#00d</item>
</style>
<!-- 定义一个样式,继承前一个颜色 -->
<style name="style2" parent="@style/style1">
<item name="android:background">#ee6</item>
<item name="android:padding">8dp</item>
<!-- 覆盖父样式中指定的属性 -->
<item name="android:textColor">#000</item>
</style>
</resources>
我们可以在我们的layout文件中如下使用:[packagename.]style.file_name
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!-- 指定使用style1的样式 -->
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/style1"
style="@style/style1"
/>
<!-- 指定使用style2的样式 -->
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/style2"
style="@style/style2"
/>
</LinearLayout>
主题(Theme)
Theme一般用于整个应用或者一些特定的Activity。Theme一般用来设置应用的或者窗体的外观样式,比如应用背景,应用边框及标题等。
下面的代码片段是Android SDK自带的默认主题(详细文件在:\android-sdk\platforms\android-16\data\res\values\themes_device_defaults.xml):
<?xml version="1.0" encoding="UTF-8"?>
<style name="Theme.DeviceDefault" parent="Theme.Holo" >
<!-- Text styles -->
<item name="textAppearance">@android:style/TextAppearance.DeviceDefault</item>
<item name="textAppearanceInverse">@android:style/TextAppearance.DeviceDefault.Inverse</item> <item name="textAppearanceLarge">@android:style/TextAppearance.DeviceDefault.Large</item>
<item name="textAppearanceMedium">@android:style/TextAppearance.DeviceDefault.Medium</item>
<item name="textAppearanceSmall">@android:style/TextAppearance.DeviceDefault.Small</item>
<item name="textAppearanceLargeInverse">@android:style/TextAppearance.DeviceDefault.Large.Inverse</item>
<item name="textAppearanceMediumInverse">@android:style/TextAppearance.DeviceDefault.Medium.Inverse</item>
<item name="textAppearanceSmallInverse">@android:style/TextAppearance.DeviceDefault.Small.Inverse</item>
<item name="textAppearanceSearchResultTitle">@android:style/TextAppearance.DeviceDefault.SearchResult.Title</item>
<item name="textAppearanceSearchResultSubtitle">@android:style/TextAppearance.DeviceDefault.SearchResult.Subtitle</item> <item name="textAppearanceButton">@android:style/TextAppearance.DeviceDefault.Widget.Button</item> <item name="textAppearanceLargePopupMenu">@android:style/TextAppearance.DeviceDefault.Widget.PopupMenu.Large</item>
<item name="textAppearanceSmallPopupMenu">@android:style/TextAppearance.DeviceDefault.Widget.PopupMenu.Small</item> <!-- Button styles -->
<item name="buttonStyle">@android:style/Widget.DeviceDefault.Button</item> <item name="buttonStyleSmall">@android:style/Widget.DeviceDefault.Button.Small</item>
<item name="buttonStyleInset">@android:style/Widget.DeviceDefault.Button.Inset</item> <item name="buttonStyleToggle">@android:style/Widget.DeviceDefault.Button.Toggle</item>
<item name="switchStyle">@android:style/Widget.DeviceDefault.CompoundButton.Switch</item> <item name="borderlessButtonStyle">@android:style/Widget.DeviceDefault.Button.Borderless</item> <item name="listSeparatorTextViewStyle">@android:style/Widget.DeviceDefault.TextView.ListSeparator</item> <!-- Window attributes -->
<item name="windowTitleStyle">@android:style/WindowTitle.DeviceDefault</item>
<item name="windowTitleBackgroundStyle">@android:style/WindowTitleBackground.DeviceDefault</item>
<item name="android:windowAnimationStyle">@android:style/Animation.DeviceDefault.Activity</item> <!-- Dialog attributes -->
<item name="alertDialogStyle">@android:style/AlertDialog.DeviceDefault</item>
<item name="dialogTheme">@android:style/Theme.DeviceDefault.Dialog</item>
<item name="alertDialogTheme">@android:style/Theme.DeviceDefault.Dialog.Alert</item></style>
主题和样式的定义方式类似:通过Style来指定并且也支持继承。我们自定义一个主题如下:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<style name="CustomrTheme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowFrame">@drawable/window_border</item>
<item name="android:windowBackground">@drawable/star</item>
</style>
</resources>
我们可以在代码中来设置一个Activity的主题,如下粗体代码行。
public class MainActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setTheme(R.style.CustomerTheme)
}
}
我们通过应用的的配置文件(AndroidManifest.xml)中来指定主题,而不是通过代码行来指定。
如果要指定一个主题应用与整个App,我们可以设置Application节点的android:theme属性:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.jeriffe.app"android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/CustomerTheme">
<activity android:name=".XXXXX">
</activity>
</application>
</manifest>
如果我们想指定主题应用与具体的Activity我们只需要设置activity的android:theme属性:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.jeriffe.app" android:versionCode="1"android:versionName="1.0">
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name=".XXXX"
android:theme="@style/CustomerTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
结束语
我们简单的介绍了Style和Theme,如果您有WEB开发或者WPhone或者WPF开发经验,那么您会很好的理解Style和Theme。
第十四章:样式(Style)和主题(Theme)的更多相关文章
- Android 自定义属性(attrs)、样式(Style)、主题(Theme)
Android 自定义属性(attrs).样式(Style).主题(Theme) https://www.cnblogs.com/dandre/p/4507024.html https://blog. ...
- Android 样式 (style) 和主题(theme)
转载:https://gold.xitu.io/post/58441c48c59e0d0056a30bc2 样式和主题 样式是指为 View 或窗口指定外观和格式的属性集合.样式可以指定高度.填充.字 ...
- Android样式(style)和主题(theme)
样式和主题 样式是指为 View 或窗口指定外观和格式的属性集合.样式可以指定高度.填充.字体颜色.字号.背景色等许多属性. 样式是在与指定布局的 XML 不同的 XML 资源中进行定义. Andro ...
- 20.(转)Android的样式(Style)和主题(Theme)
Android上的Style分为了两个方面: 1,Theme是针对窗体级别的,改变窗体样式: 2,Style是针对窗体元素级别的,改变指定控件或者Layout的样式. Android系统的themes ...
- android的样式(style)与主题(theme)
Android上的Style分为了两个方面: 1,Theme是针对窗体级别的,改变窗体样式: 2,Style是针对窗体元素级别的,改变指定控件或者Layout的样式. Android系统的themes ...
- 安卓样式Style和主题Theme
1. 区别 不过style是针对view来说的,比如TextView和EditText这些:而Theme必须针对整个activity或者整个application 2. 样式 创建一个样式,根元素 & ...
- CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章
第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮 ...
- 【odoo14】第十四章、CMS网站开发
第十四章.CMS网站开发** Odoo有一个功能齐全的内容管理系统(CMS).通过拖放功能,你的最终用户可以在几分钟内设计一个页面,但是在Odoo CMS中开发一个新功能或构建块就不是那么简单了.在本 ...
- C和指针 (pointers on C)——第十四章:预处理器
第十四章 预处理器 我跳过了先进的指针主题的章节. 太多的技巧,太学科不适合今天的我.但我真的读,读懂.假设谁读了私下能够交流一下.有的小技巧还是非常有意思. 预处理器这一章的内容.大家肯定都用过.什 ...
随机推荐
- Web程序设计笔记-第一章:基础知识
1,Web服务器 (1)Web服务器操作 Web浏览器通过向服务器发送URL来与Web服务器进行通信.URL可以指定两种不同资源中的一种:某个文件或者某个程序. Web客户机和Web服务器之间所有的通 ...
- Python延迟打印字符
我想让python打印类似“正在加载...”,每个句号打印出来与它们之间的睡眠时间0.5秒间隔 实现方法: 1 2 3 4 5 6 7 8 9 10 11 #!/bin/env python # -* ...
- Docker上运行dotnet core
下载microsoft/dotnet镜像 运行命令: docker pull microsoft/dotnet 如果没有使用阿里镜像加速的,参照这篇先配置好再跑上面命令: http://www.cnb ...
- ORACLE 分组之后容易被忽略的bug
COL_2 COL_321 3123 31 如上表数据 前台显示显示需要把COL_2的21和23转换成中文 ‘整机’ 最开始如下编写 SELECT t.col_3, CASE ...
- ZMQ 在linux进程 和分布式之间的通信
ZMQ 在linux进程 和分布式之间的通信 待补全
- java文件末尾追加内容的两种方式
java 开发中,偶尔会遇到在文件末尾对文件内容进行追加,实际上有多种方式可以实现,简单介绍两种: 一种是通过RandomAccessFile类实现,另一种是通过FileWriter类来实现. 实现方 ...
- css绘制六边形
CSS id选择器实现 正六边形 用css绘制六边形需要使用到三个容器,分别用于绘制六边形的三个部分,如下图所示: HTML代码: <div id="box1">< ...
- zlog使用
1.使用buildroot编译zlog,在工具链的系统根目录下会生成动态库和静态库,还添加了头文件. 2.把动态库拷贝到开发板文件系统(该文件系统可以不是由buildroot编译得到,而是板上自带的) ...
- ycsb使用方法
ycsb本身相当于客户端,不断向服务端发送请求,同时记录下这些请求耗费的时间. 那么,必须要有一个服务端在某个端口监听. ycsb可以在workload里写入服务端的ip和端口,也可以在命令行里写上. ...
- shell脚本学习
1.注释 如果使用bash,则在脚本文件头注释:#/bin/bash2.将脚本文件加上可读与执行权限,就可以使用./shell.sh来执行,也可以使用sh shell.sh的方式来直接执行,sh是ba ...