Android 风格和主题
Android xml风格和主题文件的编写,是涉及到整个程序界面美观的因素之一。 <wbr><wbr>当设计应用程序时,你可以用风格和主题来统一格式化各种屏幕和UI元素。较好的应用风格和主题,可以实现美观而统一的界面,和web中的CSS一样,Android也可以为界面定义全局、公用的Style。</wbr></wbr>
<wbr><wbr></wbr></wbr>
Styles和Themes都是资源文件位于res/values,当然,可以用Android提供的一些默认的风格和主题资源,也可以自定义自己的主题和风格资源。
<wbr><wbr></wbr></wbr>
Styles:
风格是一个包含一种或者多种格式化属性的集合,可以将其作为一个单位用在布局XML单个元素当中。 <wbr><wbr>比如,可以定义一种风格来定义文本的文字大小和颜色,然后将其应用于视图 <wbr><wbr>元素的一个特定实例。</wbr></wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
Theme:
主题是一个包含一种或者多种格式化属性的集合,可以将其作为一个单位用在应用程序所有的活动当中或者某个活动当中。比如,可以定义一个主题,它为window frame和panel 的前景和背景设置了特定的颜色, <wbr><wbr>并为菜单定义文字的大小和颜色属性,然后将这个Theme应用到应用程序的Activity中。</wbr></wbr>
<wbr><wbr></wbr></wbr>
Style和Theme的XML文件结构:
对每一个Styles和Themes,有一个<resources>根节点,给<style>元素增加一个全局唯一 <wbr><wbr>的名字,也可以选择增加一 <wbr><wbr>个父类属性。在后边我们可以用这个名字来应用风格,而 <wbr><wbr>父类属性标识了当前风格是继承 <wbr><wbr>于哪个风格。在<style>元素内部,申明一个或者多个<span style="color:#ff0000"><strong><item></strong></span>,每一个<item>定义了一个名字属性,并且在元素内部定义了这个风格的值。<br><wbr><wbr><br> 新建自定义的风格和主题 :<br> 1. <wbr><wbr>在res/values 目录下新建一个名叫<span style="color:#ff0000"><strong>style.xml</strong></span>的文件。<br> 2. <wbr><wbr>对每一个风格和主题,给<style>元素增加一个全局唯一的名字,和一个可选的父类属性。在后边我们可以名字来应用风格,而父类属性标识了当前风格是继承于哪个风格。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
3. <wbr><wbr>在<style>元素内部,申明一个或者多个<item>,每一个<item>定义了一个名字属性,并且在元素内部定义了这个风格的值。</wbr></wbr>
4. <wbr><wbr>然后可以在其他XML资源,manifest或应用程序代码中引用这些自定义资源。</wbr></wbr>
<wbr><wbr></wbr></wbr>
风格Styles(SDK提供的Style的例子) :
<wbr><wbr><strong><?xml version="1.0" encoding="utf-8"?><br><wbr><wbr><resources><br><wbr><wbr><wbr><wbr><style name="SpecialText" parent="@style/Text"><br><wbr><wbr><wbr><wbr><wbr><wbr><item name="android:textSize">18sp</item><br><wbr><wbr><wbr><wbr><wbr><wbr><item name="android:textColor">#008</item><br><wbr><wbr><wbr><wbr></style><br><wbr><wbr></resources><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></strong>如上所示,你可以用<item>元素来为你的风格定义一组格式化的值。在Item当中的name属性可以 <wbr><wbr>是一个字符串,一个16进制数所表示的颜色或者任何其他资源的引用。<br><wbr><wbr><br><span style="color:#ed1c24"><strong>注意:</strong></span>在<style>元素中的父类属性。这个属性让你可以能够定义一个资源,当前风格可以从这个资源当中继承到值。你可以从任何包含这个资源当中继承此风格。通常上,你的资源应该一直直接或者间接地继承Android的标准风格资源。这样的话,你就只需要定义你想改变的值。<br><wbr><wbr><br> 在这个例子当中的EditText元素,演示了如何引用一个XML布局文件当中定义的风格:<br><wbr><wbr><EditText id="@+id/text1"<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><strong><span style="color:#ff0000">style="@style/SpecialText"<br></span></strong><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>android:layout_width="fill_parent"<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>android:layout_height="wrap_content"<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>android:text="Hello, World!" /></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
现在这个EditText部件所表现出来的风格将是我们在上边的XML文件中所定义的那样。
<wbr><wbr></wbr></wbr>
另:转载一个自定义实例
1.在res/values 目录下新建一个名叫style.xml的文件。
2.在style.xml定义内容如下:
<?xml version=”1.0″ encoding=”utf-8″?>
<resources>
<wbr><wbr><span style="color:#ff0000"><strong><style name=”DavidStyleText1″><br></strong></span><wbr><wbr><wbr><wbr><wbr><wbr><item name=”android:textSize”>18sp</item><br><wbr><wbr><wbr><wbr><wbr><wbr><item name=”android:textColor”>#EC9237</item><br><wbr><wbr><strong><span style="color:#ff0000"></style><br></span></strong><wbr><wbr><strong><span style="color:#ff7e00"><style name=”DavidStyleText2″><br></span></strong><wbr><wbr><wbr><wbr><wbr><wbr><item name=”android:textSize”>14sp</item><br><wbr><wbr><wbr><wbr><wbr><wbr><item name=”android:textColor”>#FF7F7C</item><br><wbr><wbr><wbr><wbr><wbr><wbr><item name=”android:fromAlpha”>0.0</item><br><wbr><wbr><wbr><wbr><wbr><wbr><item name=”android:toAlpha”>0.0</item><br><wbr><wbr><span style="color:#ff7e00"><strong></style><br></strong></span></resources><br> 上面样式的定义,从字面意思就可以了解其功能了,下面看看如何应用它吧:</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<!– 应用样式1的TextView –>
<TextView
<wbr><wbr><strong><span style="color:#ed1c24">style="@style/DavidStyleText1"</span></strong><br><wbr><wbr>android:layout_width=”fill_parent”<br><wbr><wbr>android:layout_height=”wrap_content”<br><wbr><wbr>android:gravity=”center_vertical|center_horizontal”<br><wbr><wbr>android:text=”moandroid”/></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<!– 应用样式2的TextView –>
<TextView
<wbr><wbr><strong><span style="color:#ed1c24">style="@style/DavidStyleText2″<br></span></strong><wbr><wbr>android:layout_width=”fill_parent”<br><wbr><wbr>android:layout_height=”wrap_content”<br><wbr><wbr>android:gravity=”center_vertical|center_horizontal”<br><wbr><wbr>android:text=”www.moandroid.com”<br><wbr><wbr>android:autoLink=”all”/></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
现在这个EditText组件的所表现出来的风格就为我们在上边的XML文件中所定义的那样,如下:
看了新的界面是不是感觉漂亮多了,这也就是Styles的魅力吧。需要补充说明的是:单击超链接,还可以打开网页如下:
这是如何实现的了?TextView.setTextView不支持HTML TAG的输出,所以即便写成这样:
mTextView01.setText(”<a href=\”http://www.moandroid.com/\”>mo-android|享受Android带给我们的新体验</a>”);实际输出时,也就是纯文本而已,并不会作HTML TAG的转换。但若撇开HTML TAG之外(如“<”开头的标记),在TextView里加上了android:autoLink=”all”,那么正文中若有网址(http://),是可以被显示的。
Theme依然在<style>元素里边申明,也是以同样的方式引用。不同的是通过在Android Manifest中定义的<application>和<activity>元素将主题添加到整个程序或者某个 Activity,但是主题是不能应用在某一个单独的View里。
主题Themes :
就像风格一样,主题依然在<style>元素里边申明,也是以同样的方式引用。不同的是你通过在AndroidManifest中定义的<application>和<activity>元素将主题添加到整个程序或者活动中——主题并不能应用于个别视图。
<wbr><wbr><?xml version="1.0" encoding="utf-8"?><br><wbr><wbr><resources><br><wbr><wbr><wbr><wbr><span style="color:#ed1c24"><strong><style name="CustomTheme</strong></span>"> <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><item name="android:windowNoTitle">true</item><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><item name="windowFrame">@drawable/screen_frame</item><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><item name="windowBackground">@drawable/screen_background_white</item><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><item name="panelForegroundColor">#FF000000</item><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><item name="panelBackgroundColor">#FFFFFFFF</item><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><item name="panelTextColor">?panelForegroundColor</item><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><item name="panelTextSize">14</item><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><item name="menuItemTextColor">?panelTextColor</item><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><item name="menuItemTextSize">?panelTextSize</item><br><wbr><wbr><wbr><wbr><strong><span style="color:#ed1c24"></style></span></strong><br><wbr><wbr></resources><br> 注意:我们用了@符号和?符号来引用资源。地址符@表明我们引用的资源是其它地方定义过的(也许在这个项目中或者在Android框架中)。问号符?表明我们引用的资源的值在当前加载的主题中。这通过以名字引用特定的<item>来完成(比如,panelTextColor使用了分配给panelForegroundColor的相同颜色)。这种技巧只能用在XML资源当中。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
在manifest中设置主题Set the theme in the manifest : <wbr><wbr><br> 为了给应用程序所有的活动设置主题,你可以打开清单文件AndroidManifest.xml,编辑<application>标签,让其包含android:theme属性,值是一个主题的名字,如下:</wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><strong><span style="color:#ed1c24"><application android:theme="@style/CustomTheme"><br></span></strong><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
Android中提供了几种内置的资源,有好几种主题可以用于切换而不用自己写。如果你只是想让你程序当中的某个Activity拥有这个主题,那么你可以修改<activity>标签。就像Android提供的其他内置资源一样,有好几种主题你可以切换而不用自己写。比如你可以用对话框主题来让你的活动看起来像一个对话框。在manifest中,像下面这样引用一个Android主题:
<wbr><wbr><wbr><wbr><span style="color:#ed1c24"><strong><wbr><wbr><activity android:theme="@android:style/Theme.Dialog"></wbr></wbr></strong></span></wbr></wbr></wbr></wbr>
如果你喜欢一个主题,但是想做一些轻微的调整,你只需要将这个主题添加为父主题。比如,我们将修改Theme.Dialog主题。为此,创建一个风格以Theme.Dialog为父主题:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#ed1c24"><strong><style name="CustomDialogTheme" parent="@android:style/Theme.Dialog"></strong></span><br> 就这样,我们已经继承了Android对话框主题,因此我们可以按照自己的意愿来调整主题。这样,对于这个对话框主题中每个我们想要改变的item,我们可以在这里重新定义它的值然后在Android Manifest 文件中使用CustomDialogTheme而不是Theme.Dialog。 <wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><br><strong><span style="color:#1648ff">在程序当中设置主题Set the theme from the application :</span></strong> <wbr><wbr><br> 如果需要的话,你还可以以编程的方式来给一个活动加载主题。为此,要使用setTheme()方法。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
注意:这样做,你应该在初始化任何上下文中的视图之前设置主题。比如,在用setContentView(View)或者inflate(int, ViewGroup)方法前。这确保系统将当前主题应用在你所有的用户界面屏幕上。
<wbr><wbr><wbr><wbr>protected void onCreate(Bundle savedInstanceState) {<br><wbr><wbr><wbr><wbr><wbr><wbr>super.onCreate(savedInstanceState);<br><wbr><wbr><wbr><wbr><wbr><wbr>...<br><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#ed1c24"><strong>setTheme(android.R.style.Theme_Light);</strong></span><br><wbr><wbr><wbr><wbr><wbr><wbr>setContentView(R.layout.linear_layout_3);<br><wbr><wbr><wbr><wbr>}<br> 如果你打算在程序代码中来加载主界面的主题,那么需要注意这个主题将不能应用于任何系统用来启动这个活动的动画,这些动画将在应用程序启动前发生。在大多数情况下,如果你想将主题应用到你的主界面,在XML中定义是一个更好的办法。<br><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
了解关于自定义风格和主题以及如何在应用程序中引用它们的详细信息,参见可用资源类型:风格和主题Available Resource Types: Style and Themes。
了解关于缺省可用的主题和风格的信息,参见R.style
<wbr><wbr></wbr></wbr>
另:在转载一个列子定义Theme的一个例子
<?xml version=”1.0″ encoding=”UTF-8″?>
<resources>
<wbr><wbr><span style="color:#ed1c24"><strong><style name=”NewTheme” parent=”android:Theme.Black”><br></strong></span><wbr><wbr><wbr><wbr><wbr><wbr><item name=”android:windowNoTitle”>true</item><br><wbr><wbr><wbr><wbr><wbr><wbr><item name=”android:textSize”>14sp</item><br><wbr><wbr><wbr><wbr><wbr><wbr><item name=”android:textColor”>#FFFF0000</item><br><strong><span style="color:#ed1c24"></style><br></span></strong></resources></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
-
@ 表明我们应用的资源是前边定义过的(或者在前一个项目中或者在Android 框架中)。
-
?表明我们引用的资源的值在当前的主题当中定义过。
这些技巧只能用在XML资源当中
<wbr><wbr></wbr></wbr>
这里需要注意的是,对于theme资源的引用,资源ID不是文件名(theme.xml),而是资源名(NewTheme)。运行后的界面显示如下:
在AndroidManifest.xml中应用Theme
-
为了在当前所有的Activity当中使用Theme,可以打开AndroidManifest.xml 文件,编辑<application>标签,让其包含android:theme属性,值是一个主题的名字,
-
例如: <application android:theme=”@style/NewTheme”>
-
如果只是想让程序当中的某个Activity拥有这个Theme,那么可以修改<activity>标签。Android中提供了几种内置的资源,有好几种Theme你可以切换而不用自己写。比如可以用对话框Theme来让你的Activity看起来像一个对话框。在manifest中定义,
-
例如: <activity android:theme=”@android:style/Theme.Dialog”>
-
比如:我们修改Theme.Dialog Theme,继承ThemeDialog来生成一个新的Theme。
<style parent=”@android:style/Theme.Dialog ”>
继承了Theme.Dialog后,我们可以按照我们的要求来调整Theme。我们可以修改在Theme.Dialog中定义的每个item元素的值,然后我们在Android Manifest 文件中使用NewDialogTheme而不是 Theme.Dialog。