zoukankan      html  css  js  c++  java
  • Android之styles.xml,以及自定义风格

    1.styles.xml

    在现在的ADT创建的Project中,会有values,values-v11和values-v14三个文件夹,每个文件夹下都有一个styles.xml.

    API11是Android3.0,API14是Android4.0。这三个文件夹里的style.xml是这个意思:

    values文件夹里的styles.xml是为没有指定API的系统版本指定的风格,我理解的就是API11以下的版本所用的风格。这个styles.xml里面有两个style标签,第一个是:

    <style name="AppTheme" parent="AppBaseTheme">

    注意他继承了AppBaseTheme。当然你可以在AppTheme里给3.0以下的机型弄一些自己的风格。第二个是:

    <style name="AppBaseTheme" parent="@android:style/Theme.Light">

    也就是第一个的AppTheme的parent标签。而AppBaseTheme的父类就是系统built in的风格了。注意这个“parent="@android:style/Theme.Light”是没有调用appcompat的类库的,如果调用了则会是“Theme.AppCompat.Light”。

    values-v11里的styles.xml是这个意思:

    Base application theme for API 11+. This theme completely replaces AppBaseTheme from res/values/styles.xml on API 11+(3.0) devices.

    在API 11+的机器上,之前values文件夹里的styles.xml的AppTheme标签就不再直接继承那个文件里的AppBaseTheme,改为继承values-v11文件夹里的这个AppBaseTheme。

    values-v14同理,在4.0以上的机器上用这个文件夹的风格。

    这就是为什么同一个应用在不同的机器上显示不同的风格,比如values-v11中:

    <style name="AppBaseTheme" parent="@android:style/Theme.Holo.Light">

    而values-v14中:

    <style name="AppBaseTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">

    就会显示黑白两种风格。

    不过Android 3.x的机器很少,大部分人都在用4.x或是停留在2.x。所以values-v11常常不用动。

    2.自定义风格

    按照Android Developers里的Customize the Background的描述,如何改ActionBar的背景呢?分为3.0以上 和 2.1以上,3.0以下两种处理方式。对于2.1以上3.0以下,用appcompat的library,可以在values文件夹定义一个themes.xml,内容是:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <!-- the theme applied to the application or activity -->
        <style name="CustomActionBarTheme"
               parent="@style/Theme.AppCompat.Light.DarkActionBar">
            <item name="android:actionBarStyle">@style/MyActionBar</item>
    
            <!-- Support library compatibility -->
            <item name="actionBarStyle">@style/MyActionBar</item>
        </style>
    
        <!-- ActionBar styles -->
        <style name="MyActionBar"
               parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
            <item name="android:background">@drawable/actionbar_background</item>
    
            <!-- Support library compatibility -->
            <item name="background">@drawable/actionbar_background</item>
        </style>
    </resources>

    可以看到,android:actionBarStyle和actionBarStyle都override了MyActionBar,而MyActionBar用中的android:background和background又都覆写了新的drawable,这是分两步完成的。至于要不要加"android:",从注释看出来,不加android:的是支持appcompat类库的风格的。

    把"@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse"一层层追溯到最后,可以看到的是一个没有用到Appcompat风格的style:

    里面有一个android:background.可以看到它的属性是@android:drawable....,推测含有android:..前缀的属性都是系统自带的资源,包括上面的android:background.

    然后,在manifest里用:

    <application android:theme="@style/CustomActionBarTheme" ... />

    来应用风格。

    那么为什么@style可以找到themes.xml里的风格呢。我尝试把themes.xml重命名一下,改成了"asd.xml",发现仍然显示新的风格。总是可以找到的。也许这就是为什么大型的APP里有大量各种自己命名的xml。暂且命名为ationbar.xml好了。

    我我尝试把actionbar.xml里的内容再转移到styles.xml的时候,ADT却在android:background处报错说需要minsdk:11,当前为8。

    于是我把这些内容移到values-v14文件夹的styles.xml中,果然不报错了——这三个values文件夹是有最低sdk版本要求的。运行,正常。

    但是当我「性致勃勃」地将actionbar.xml恢复原状,恢复到最初的不要求最低版本SDK的values文件夹中的时候,FUCK,竟然开始报错了,刚才可是都正常运行了的啊。。。这一定是ADT又犯病了跟我没关系。。于是我把actionbar.xml转移到valuse-v11文件夹里,不报错。但是在运行在Android2.3上的时候报错说;

    “You need to use a theme.Appcompat theme..”

    这很好理解,因为在manifest里指定的风格是:

    <application android:theme="@style/CustomActionBarTheme" ... />

    而在valuse文件夹找不到这个风格。

    方法是:

    <item name="android:actionBarStyle">@style/MyActionBar</item>

    <item name="android:background">@drawable/actionbar_background</item>

    两行删去,再另存为actionbar.xml,复制到valuse文件夹里,于是可以在2.3运行了。这就更印证了带有「android:」前缀的资源的是系统自带的资源,不能在低版本override(覆写)。

    下面要考虑的事情是,第一,改变其他风格。

    第二,有个疑问是,如果用这个代码应用风格:

    <application android:theme="@style/CustomActionBarTheme" ... />

    那么岂不是只能应用一种风格?其他xml文件里怎么整?这个问题可以参考反编译出来的人家的应用。先去吃饭了。

    --------------------

    「知乎」的manifest里面是这样用不同的theme的:

    每一个Activity都指定theme。

    接下来是自定义ActionBar的文字颜色。

    官方教程上给出了这样的代码(节选):

    <style name="CustomActionBarTheme"
               parent="@style/Theme.AppCompat">
            <item name="android:actionBarStyle">@style/MyActionBar</item>
            <item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item>
            <item name="android:actionMenuTextColor">@color/actionbar_text</item>
    .....

    parent从之前的parent="@style/Theme.AppCompat.Light.DarkActionBar"

    变成了:parent="@style/Theme.AppCompat",但是由于之前的那个与现在的是继承关系,所以之前的能覆写,现在的就肯定能覆写了。

    其中的这两行:

    <item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item>
    <item name="android:actionMenuTextColor">@color/actionbar_text</item>

    第一个item跟原来一样,加上:

            <!-- ActionBar tabs text 其实就是「Navigation Tabs的文字颜色」-->
        <style name="MyActionBarTabText"
               parent="@style/Widget.AppCompat.ActionBar.TabText">
            <item name="android:textColor">@color/actionbar_text</item>
            <!-- The textColor property is backward compatible with the Support Library -->
        </style>

    即可,注意,这个「TabText」是改变Navitation Tabs的颜色的。

    第二个item,需要在values文件夹建立一个color.xml(试了一下,跟其他的style一样,这个xml也可以任意命名,但还是命名成color好了毕竟不需要很多这种颜色定义的文件),

    内容是:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <color name="actionbar_text">#FF0000</color>
    </resources>

    这样我就把actionbar_text设置成了红色。

    附上改变ActionBar颜色的方法:

  • 相关阅读:
    MySQL改动rootpassword的多种方法
    略论并行处理系统的日志设计
    ERROR (UnicodeEncodeError): 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128
    UnicodeEncodeError: 'ascii' codec can't encode character u'u65e0' in position 1: ordinal not in range(128)
    python -m json.tool 中文乱码 Format JSON with python
    CentOS6.6 zookeeper完全集群搭建
    libvirt kvm云主机监控
    glance image-create
    通过上一节部署出来的 Windows instance 有时候会发现操作系统时间总是慢 8 个小时,即使手工调整好时间和时区,下次 instance 重启后又会差 8 个小时
    云监控网址
  • 原文地址:https://www.cnblogs.com/larrylawrence/p/3688168.html
Copyright © 2011-2022 走看看