很多时候,系统的主题并不适用,app想要自己喜欢的主题,这个时候需要自定义一个主题。
这里就简单讲述一下自定义主题的步骤。(以DarkActionBar修改title大小为例)
一、相关文件:
主题相关的文件:
AndroidManifest.xml和styles.xml文件
在AndroidManifest中需要引用自定义的主题给app使用:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/MyTheme" >最后一样引用自定义的主题:MyTheme。
这个MyTheme,定义在styles.xml中。
这个sytyles.xml在目录:res/values/下面。
二、如何写自定应的styles.xml
认识一个东西,一定是先直观看上去,有了第一直观认知;再次进行详细的分析就能认识一个事物。
所以这里先看一下我们的demo中的styles.xml。(自定义:修改DarkActionBar的title字体大小)
<resources> <style name="MyTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar" > <item name="android:actionBarStyle">@style/Inverse</item> </style> <style name="Inverse" parent="android:Widget.Holo.Light.ActionBar.Solid.Inverse"> <item name="android:titleTextStyle">@style/TextAppearance</item> </style> <style name="TextAppearance" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title.Inverse"> <item name="android:textSize">100px</item> </style> </resources>命名并没有太规范,重点在于如何自定义主题。关注方法步骤即可。
说一下语法框架:其中里面的<style>和<item>可以写 很多条,根据需要而定。
<resources> <style name="MyTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar" > <item name="修改的属性名字">对应的资源值</item> </style> </resources>
下面看是讲述如何自定义:两步即可:觅祖寻根
自定义一个主题,定然不是全部自己写,现有android主题丰富,定然有个主题可以parent,只需要重新定义其中的部分属性而已。
举一反三,这里就之讲解title修改,其他的修改是一样的。
1.首先,觅祖
这里我们就想用DarkActionBar中的大多数现有效果,所以选定parent为@android:style/Theme.Holo.Light.DarkActionBar
2.其次,寻根
通过1找到了可以拿来继承的parent,绝大多数的属性都可以直接用了。少部分属性需要修改,这里我们就要抽丝剥茧,层层查找了,找到根属性来进行修改。
上面这句话可能比较难理解,拿上面的例子看一下,例子就是层层递进,到根style才可以。
目标是修改ActionBar的title,先继承DarkActionBar之后,还需要定义style Inverse--sytle TextAppreance然后在Item里写。
抛出两个问题:a.如何确定递进层?b.这个层层递进的终点到哪里
这两个问题解决了,方法也就掌握了。
a.如何确定递进层
首先明确是Holo.Light.DarkActionBar,其次明确修改actionbar的title大小。
这一步还是有难度的,层层递进的路径不是太好确定,DarkActionBar下面有很多属性,哪一个会包含这个title大小,只能点开去看了。(开发环境使用的AS,Eclipse一样)
直接ctrl+鼠标左建,进入定义:(只截取了部分)
<style name="Theme.Holo.Light.DarkActionBar"> <item name="windowContentOverlay">@drawable/ab_solid_shadow_holo</item> <item name="actionBarStyle">@style/Widget.Holo.Light.ActionBar.Solid.Inverse</item> <item name="actionBarWidgetTheme">@style/Theme.Holo</item> <item name="actionBarTheme">@null</item>刚才说了,不好确定title定义的具体位置,只能根据这一层的名字来推断了。
其中actionBarStyle名字看起来最有可能,actionbar的样式嘛,可能在这里,在进去看看里面有没有。进到后面的值:
Widget.Holo.Light.ActionBar.Solid.Inverse
如下
<style name="Widget.Holo.Light.ActionBar.Solid.Inverse"> <item name="titleTextStyle">@style/TextAppearance.Holo.Widget.ActionBar.Title.Inverse</item>这里就看到了titleTextStyle,基本就能确定了就是这个,再进入看看
<style name="TextAppearance.Holo.Widget.ActionBar.Title.Inverse" parent="TextAppearance.Holo.Medium.Inverse"> <item name="textSize">@dimen/action_bar_title_text_size</item> </style>好了,找到了,这里就是textSize的大小了。
b.寻根
其实这个步骤就夹杂在a步骤中,层层寻找,找到了具体的属性值定义的地方,也就到根了。
根和层的不同就在这里:
层还是@style,根则是具体的dimen、drawable等了。
到这里基本就搞定了。
写的时候,顺着来,一层一层写,最后把textSize的值改了就可以了。
三、开始书写
从原声定义:层次到根
actionBarStyle---Widget.Holo.Light.ActionBar.Solid.Inverse---TextAppearance.Holo.Widget.ActionBar.Title.Inverse---textSize
1.定义自己的theme,并继承需要的parent
<style name="MyTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar" >
2.复写需要的属性或style
由二分析,我们需要一层一层的复写,不能直接写textSize,不会生效的。
复写的时候,继承parent,只复写需要修改的属性或style就可以了。
由二分析,需要复写actionbar中style,所以这里需要定义一个style,从而继续复写其中的属性或者style
<item name="android:actionBarStyle">@style/Inverse</item>这样第一步就完成了
<style name="MyTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar" > <item name="android:actionBarStyle">@style/Inverse</item> </style>
3.后面的就类似了:
由actionBarStyle---Widget.Holo.Light.ActionBar.Solid.Inverse,所以我们自定义的style Inverse需要继承:android:Widget.Holo.Light.ActionBar.Solid.Inverse,然后复写里面的titleTextStyle。以此类推。
<style name="Inverse" parent="android:Widget.Holo.Light.ActionBar.Solid.Inverse"> <item name="android:titleTextStyle">@style/TextAppearance</item> </style> <style name="TextAppearance" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title.Inverse"> <item name="android:textSize">100px</item> </style>这里为了突出效果,将title大小改为100px。
当然,这里只是修改title,其他的额像背景色等,类似修改,就可以订制出需要的主题了。