android 自定义主题

本文介绍了如何自定义Android应用程序的主题,特别是针对DarkActionBar,通过修改styles.xml文件,详细阐述了从寻找父主题(Theme.Holo.Light.DarkActionBar),到定位并修改title字体大小的步骤,包括如何确定递进层和找到属性根节点的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多时候,系统的主题并不适用,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,其他的额像背景色等,类似修改,就可以订制出需要的主题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值