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颜色的方法:

Android之styles.xml,以及自定义风格的更多相关文章

  1. 自定义android 4.0以上的对话框风格

    做个笔记,这里是Dialog的风格,如果是用AlertDialog创建的,不能直接用.在styles.xml的写法: <style name="DialogWindowTitle&qu ...

  2. android 程序中res/values-v14/styles.xml报错的解决办法

    从旧的ADT迁移的新的ADT时, android 程序中res/values-v14/styles.xml报错: error: Error retrieving parent for item: No ...

  3. android自定义风格的toast

    先上图看一下我的自定义toast的样式 源码下载地址: CustomToastActivity.java源码 package com.jinhoward.ui_customtoast; /** * A ...

  4. 【Android Training UI】创建自定义Views(Lesson 1 - 创建一个View类)

    发布在我的网站 http://kesenhoo.github.io/blog/2013/06/30/android-training-ui-creating-custom-views-lesson-1 ...

  5. android关于AndroidManifest.xml详细分析

    http://my.eoe.cn/1087692/archive/5927.html 一.关于AndroidManifest.xmlAndroidManifest.xml 是每个android程序中必 ...

  6. Android开发学习之 定制界面风格

    统一的用户界面是可以使得应用程序更友好.要做到用户界面的统一,我们就必须用到风格(style)和主题(theme).OPhone系统提供了很多系统默认的风格和主题,但是很多情况下,这些不能满足我们的需 ...

  7. 转 Android 4.0后,自定义Title报错 You cannot combine custom titles with other title feature

      自定义Titlebar时为了避免冲突 需要修改:AndroidManifest.xml android:theme="@style/mystyle" styles.xml文件中 ...

  8. Android之AndroidManifest.xml文件解析

    转自:Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文 ...

  9. Android学习----AndroidManifest.xml文件解析

    一个Android应用程序的结构: 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了pack ...

随机推荐

  1. 【maven】架包下载失败,maven引入架包失败,pom文件未报错,但是引用的注解找不到

    出现这种问题 看到这个jar包显示是unkown,不知道版本,所以这样的解决方法就是 1.先查看maven设置是使用的自定义的仓库还是默认的仓库 2.删除掉你引用的jar包下载失败的文件夹 3.然后重 ...

  2. 【Tensorflow】tf.argmax函数

    tf.argmax(input, axis=None, name=None, dimension=None) 此函数是对矩阵按行或列计算最大值   参数 input:输入Tensor axis:0表示 ...

  3. 【Python】输出程序运行的百分比

    对于一些大型的Python程序.我们须要在命令行输出其百分比,显得更加友好,以免被人误会程序陷入死循环.假死的窗口. 关键是利用到不换行的输出符\r,\r的输出.将直接覆盖掉此行的内容. 比方例如以下 ...

  4. Vue 字面量语法 vs 动态语法

    初学者常犯的一个错误是使用字面量语法传递数值: <!-- 传递了一个字符串 "1" --> <comp some-prop="1">&l ...

  5. wince开发_摩托罗拉MC3100_打开条码设置

    呵呵不多说,直接上图 1.打开控制面板 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0 ...

  6. 无线热点登陆认证原理探究---captive portal

    什么是Captive Portal 大家肯定都连过公共场所的wifi热点,比如麦当劳等地方的.他们的wifi往往一连上去就会弹出一个要求登录或者微信关注之类的页面,只有在这个页面完成操作了才能正常访问 ...

  7. linux查找文件夹下的全部文件里是否含有某个字符串

    查找文件夹下的全部文件里是否含有某个字符串  find .|xargs grep -ri "IBM"  查找文件夹下的全部文件里是否含有某个字符串,而且仅仅打印出文件名称  fin ...

  8. 获取EF查询的SQL语句

    在EF编程中我们能够通过lamda表达式能够进行查询数据.获取到IQueryable<T>结果,我们要想知道详细的SQL语句是什么须要使用ObjectQuery<T>进行处理 ...

  9. Android 非静态内部类导致内存泄漏原因深入剖析

    背景 上周发现蘑菇街IM-Android代码里面.一些地方代码编写不当.存在内存泄漏的问题.在和疯紫交流的过程中.发现加深了一些理解,所以决定写一下分析思路,相互学习. 内存泄漏 一个不会被使用的对象 ...

  10. Spark SQL之External DataSource外部数据源(二)源代码分析

    上周Spark1.2刚公布,周末在家没事,把这个特性给了解一下,顺便分析下源代码,看一看这个特性是怎样设计及实现的. /** Spark SQL源代码分析系列文章*/ (Ps: External Da ...