原文地址 http://www.cnblogs.com/Dentist/p/4369816.html

Theme是一套UI控件和Activity的样式。可以给Application 和 activity 设置主题。来设置显示界面的样式。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jude.test.education" > <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
<!--这里设置的是整个APP的主题,所有activiy和view都会默认为这个主题-->
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
<!--这里设置的是这个Activity的主题,Activity所有view都会默认为这个主题-->
android:theme="@style/AppTheme"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

在value->style里定义主题。可以继承并重写属性。

    <!-- 兼容主题 深色主题 activity背景默认黑色,字体默认白色-->
<style name="AppTheme" parent="Theme.AppCompat">
</style> <!-- 兼容主题 浅色主题 activity背景默认白色 字体默认黑色 -->
<style name="AppTheme2" parent="Theme.AppCompat.Light">
</style> <!-- 兼容主题 深色主题 无Actionbar-->
<style name="AppTheme3" parent="Theme.AppCompat.NoActionBar">
</style> <!-- 兼容主题 浅色主题 无Actionbar-->
<style name="AppTheme4" parent="Theme.AppCompat.Light.NoActionBar">
</style>

如果使用 android.support.v7.app.ActionBarActivity 就必须要用兼容主题Theme.AppCompat。

ActionBarActivity 的存在就是为了兼容低API。让他们用上高API的东西。比如Toolbar。

如果使用普通的Activity就可以用Holo主题。

Holo主题是Android4.0开始谷歌极力推行的Android Design的主题。

    <style name="AppTheme5" parent="android:Theme.Holo">
</style>

不过Android5.0谷歌又推出了Material Design来取代Android Design。

如果你的APP从5.0起配的话就可以直接使用Material主题

    <style name="AppTheme5" parent="android:Theme.Material">
</style>

在代码中设置Activity的主题

setTheme(R.style.Theme_AppCompat);

Activity 是 ContextThemeWrapper的子类。而ContextThemeWrapper一个很重要的 属性就是Theme。

实例化一个View必须要 new View(Context context) 。因为View需要把Attributes交给Context的Theme来确定一堆属性(在一个叫TypedArray的容器里)。

比如当你没有定义TextView的字体颜色时,他该显示什么颜色。他要去问Theme。

下面是Theme的官方解释加上我险过四级的英语水平。

/**
* This class holds the current attribute values for a particular theme.
    这个类持有特定主题的当前attribute
* In other words, a Theme is a set of values for resource attributes;
    换句话说是资源attribute属性的集合
* these are used in conjunction with {@link TypedArray}
    这些属性和TypedArray结合使用
* to resolve the final value for an attribute.
    来得出attribute的最终值
*
* <p>The Theme's attributes come into play in two ways: (1) a styled
    这个主题的属性通过两种方式执行:
* attribute can explicit reference a value in the theme through the
    (1)一个设置过的attribute可以通过"?themeAttribute"语法明确引用一个值
   * "?themeAttribute" syntax; (2) if no value has been defined for a
    (2)如果在一个特定的 attribute 有一个没有被定义的值,在最后我们会尝试
* particular styled attribute, as a last resort we will try to find that
    在主题中找到他那个值
* attribute's value in the Theme.
*
* <p>You will normally use the {@link #obtainStyledAttributes} APIs to
* retrieve XML attributes with style and theme information applied.
*/
public final class Theme {
/*
*太长不写
*/
}

  

常用的theme项:

    <style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!--主色-->
<item name="colorPrimary">@color/theme_primary</item>
<!--深色主色-->
<item name="colorPrimaryDark">@color/theme_primary</item>
<!--醒目主色-->
<item name="colorAccent">@color/theme_accent</item>
<!--抽屉开关样式-->
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
</style> <style name="AppTheme" parent="BaseTheme">
<!--窗体透明-->
<item name="android:windowIsTranslucent">true</item>
<!--窗体背景-->
<item name="android:windowBackground">@android:color/transparent</item>
</style> <style name="LaunchTheme" parent="Theme.AppCompat.NoActionBar">
<!--窗体背景,这个背景能在第一时间显示,可以用作启动界面,但此windows不可再使用view-->
<item name="android:background">@drawable/bg_launch</item>
</style> <style name="MainTheme" parent="BaseTheme">
<!--窗体动画-->
<item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
</style> <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
<!--抽屉开关箭头颜色-->
<item name="color">@android:color/white</item>
</style>

所有theme项:

     <item name="windowActionBar">true</item>
<item name="windowActionBarOverlay">false</item> <!-- Used by MediaRouter -->
<item name="isLightTheme">false</item> <item name="selectableItemBackground">@drawable/abc_item_background_holo_dark</item>
<item name="selectableItemBackgroundBorderless">?attr/selectableItemBackground</item>
<item name="homeAsUpIndicator">@drawable/abc_ic_ab_back_mtrl_am_alpha</item> <item name="dividerVertical">@drawable/abc_list_divider_mtrl_alpha</item>
<item name="dividerHorizontal">@drawable/abc_list_divider_mtrl_alpha</item> <!-- Action Bar Styles -->
<item name="actionBarTabStyle">@style/Widget.AppCompat.ActionBar.TabView</item>
<item name="actionBarTabBarStyle">@style/Widget.AppCompat.ActionBar.TabBar</item>
<item name="actionBarTabTextStyle">@style/Widget.AppCompat.ActionBar.TabText</item>
<item name="actionButtonStyle">@style/Widget.AppCompat.ActionButton</item>
<item name="actionOverflowButtonStyle">@style/Widget.AppCompat.ActionButton.Overflow</item>
<item name="actionOverflowMenuStyle">@style/Widget.AppCompat.PopupMenu.Overflow</item>
<item name="actionBarStyle">@style/Widget.AppCompat.ActionBar.Solid</item>
<item name="actionBarSplitStyle">?attr/actionBarStyle</item>
<item name="actionBarWidgetTheme">@null</item>
<item name="actionBarTheme">@style/ThemeOverlay.AppCompat.ActionBar</item>
<item name="actionBarSize">@dimen/abc_action_bar_default_height_material</item>
<item name="actionBarDivider">?attr/dividerVertical</item>
<item name="actionBarItemBackground">?attr/selectableItemBackgroundBorderless</item>
<item name="actionMenuTextAppearance">@style/TextAppearance.AppCompat.Widget.ActionBar.Menu</item>
<item name="actionMenuTextColor">?android:attr/textColorPrimaryDisableOnly</item> <!-- Dropdown Spinner Attributes -->
<item name="actionDropDownStyle">@style/Widget.AppCompat.Spinner.DropDown.ActionBar</item> <!-- Action Mode -->
<item name="actionModeStyle">@style/Widget.AppCompat.ActionMode</item>
<item name="actionModeBackground">@drawable/abc_cab_background_top_material</item>
<item name="actionModeSplitBackground">?attr/colorPrimaryDark</item>
<item name="actionModeCloseDrawable">@drawable/abc_ic_ab_back_mtrl_am_alpha</item>
<item name="actionModeCloseButtonStyle">@style/Widget.AppCompat.ActionButton.CloseMode</item> <item name="actionModeCutDrawable">@drawable/abc_ic_menu_cut_mtrl_alpha</item>
<item name="actionModeCopyDrawable">@drawable/abc_ic_menu_copy_mtrl_am_alpha</item>
<item name="actionModePasteDrawable">@drawable/abc_ic_menu_paste_mtrl_am_alpha</item>
<item name="actionModeSelectAllDrawable">@drawable/abc_ic_menu_selectall_mtrl_alpha</item>
<item name="actionModeShareDrawable">@drawable/abc_ic_menu_share_mtrl_alpha</item> <!-- Panel attributes -->
<item name="panelMenuListWidth">@dimen/abc_panel_menu_list_width</item>
<item name="panelMenuListTheme">@style/Theme.AppCompat.CompactMenu</item>
<item name="panelBackground">@drawable/abc_menu_hardkey_panel_mtrl_mult</item>
<item name="android:panelBackground">@android:color/transparent</item>
<item name="listChoiceBackgroundIndicator">@drawable/abc_list_selector_holo_dark</item> <!-- List attributes -->
<item name="textAppearanceListItem">@style/TextAppearance.AppCompat.Subhead</item>
<item name="textAppearanceListItemSmall">@style/TextAppearance.AppCompat.Subhead</item>
<item name="listPreferredItemHeight">64dp</item>
<item name="listPreferredItemHeightSmall">48dp</item>
<item name="listPreferredItemHeightLarge">80dp</item>
<item name="listPreferredItemPaddingLeft">16dip</item>
<item name="listPreferredItemPaddingRight">16dip</item> <!-- Required for use of support_simple_spinner_dropdown_item.xml -->
<item name="spinnerDropDownItemStyle">@style/Widget.AppCompat.DropDownItem.Spinner</item>
<item name="dropdownListPreferredItemHeight">?attr/listPreferredItemHeightSmall</item> <!-- Popup Menu styles -->
<item name="popupMenuStyle">@style/Widget.AppCompat.PopupMenu</item>
<item name="textAppearanceLargePopupMenu">@style/TextAppearance.AppCompat.Widget.PopupMenu.Large</item>
<item name="textAppearanceSmallPopupMenu">@style/TextAppearance.AppCompat.Widget.PopupMenu.Small</item>
<item name="listPopupWindowStyle">@style/Widget.AppCompat.ListPopupWindow</item>
<item name="dropDownListViewStyle">@style/Widget.AppCompat.ListView.DropDown</item> <!-- SearchView attributes -->
<item name="searchViewStyle">@style/Widget.AppCompat.SearchView</item>
<item name="android:dropDownItemStyle">@style/Widget.AppCompat.DropDownItem.Spinner</item>
<item name="textColorSearchUrl">@color/abc_search_url_text</item>
<item name="textAppearanceSearchResultTitle">@style/TextAppearance.AppCompat.SearchResult.Title</item>
<item name="textAppearanceSearchResultSubtitle">@style/TextAppearance.AppCompat.SearchResult.Subtitle</item> <!-- ShareActionProvider attributes -->
<item name="activityChooserViewStyle">@style/Widget.AppCompat.ActivityChooserView</item> <!-- Toolbar styles -->
<item name="toolbarStyle">@style/Widget.AppCompat.Toolbar</item>
<item name="toolbarNavigationButtonStyle">@style/Widget.AppCompat.Toolbar.Button.Navigation</item> <item name="android:editTextStyle">@style/Widget.AppCompat.EditText</item>
<item name="editTextBackground">@drawable/abc_edit_text_material</item>
<item name="editTextColor">?android:attr/textColorPrimary</item>
<item name="android:autoCompleteTextViewStyle">@style/Widget.AppCompat.AutoCompleteTextView</item> <!-- Color palette -->
<item name="colorPrimaryDark">@color/primary_dark_material_dark</item>
<item name="colorPrimary">@color/primary_material_dark</item>
<item name="colorAccent">@color/accent_material_dark</item> <item name="colorControlNormal">?android:attr/textColorSecondary</item>
<item name="colorControlActivated">?attr/colorAccent</item>
<item name="colorControlHighlight">@color/ripple_material_dark</item>
<item name="colorButtonNormal">@color/button_material_dark</item>
<item name="colorSwitchThumbNormal">@color/switch_thumb_normal_material_dark</item> <item name="drawerArrowStyle">@style/Widget.AppCompat.DrawerArrowToggle</item> <item name="switchStyle">@style/Widget.AppCompat.CompoundButton.Switch</item> <item name="android:ratingBarStyle">@style/Widget.AppCompat.RatingBar</item> <!-- Button styles -->
<item name="android:buttonStyle">@style/Widget.AppCompat.Button</item>
<item name="android:buttonStyleSmall">@style/Widget.AppCompat.Button.Small</item>
<item name="android:textAppearanceButton">@style/TextAppearance.AppCompat.Button</item>

继承一个Theme。重载上面的属性可以更方便的控制整个APP的风格。

下面说说style。

theme是全局的设计风格。style是局部的设计风格。

看我另一篇介绍ToolBar的帖子。里面说到了。系统是Light主题。而ToolBar需要Dark主题。可以给ToolBar单独设置一个

app:theme="@style/Theme.AppCompat"

而只有toolbar是特例。其他view并不能使用这个。
所以谷歌推出了 ThemeOverlay 来解决这个问题。详情自行翻墙:https://chris.banes.me/2014/11/12/theme-vs-style/
<LinearLayout
android:theme="@android:style/ThemeOverlay.Material.Dark"> <!-- Anything here will also have a dark theme --> </LinearLayout>

这样就可以给View设置单独主题了。

 
												

Android Theme的使用的更多相关文章

  1. android:theme决定AlertDialog的背景颜色

    最近遇到一个很奇怪的问题,两个项目弹出的dialog背景颜色不一样,一个是黑色的,一个是白色的,最后发现是AndroidManifest.xml文件里面application指定的android:th ...

  2. Android系统自带样式(android:theme)详解-(转)

    android:theme="@android:style/Theme.Dialog" : Activity显示为对话框模式 android:theme="@androi ...

  3. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

  4. android Theme使用三

    ☆ obtainStyledAttributes参数说明 和使用说明 1)  obtainStyledAttributes(int[]attrs) int[] attrs返回的是attrs.xml里一 ...

  5. 项目引入android-support-v7-appcompat遇到的问题,no resource found that matches the given name 'android:Theme.AppCompat.Light'

    一.问题 今天准备使用v7包中的ToolBar来用,但是在styles.xml中引入Theme.AppCompat.Light的时候,报错“no resource found that matches ...

  6. android:theme

    附件:常用的系统提供的 android:theme 样式一览表 01 android:theme="@android:style/Theme.Dialog" 将一个Activity ...

  7. Android - 错误:&quot;No resource found that matches the given name android:Theme.Material&quot;

    Android - 错误:"No resource found that matches the given name android:Theme.Material" 本文地址:  ...

  8. 【Android】Android Theme的设置

    在AndroidManifest.xml文件中,可以对每一个Activity设置android:theme theme的设置 可以设置为系统自带的格式,也可以自定义格式. A: 系统自带格式 @and ...

  9. Android Theme.AppCompat.Light的解决方法

    styles.xml中<style name="AppBaseTheme" parent="Theme.AppCompat.Light">提示如下错 ...

随机推荐

  1. Spring中Bean管理的常用注解

    在Spring中,主要用于管理bean的注解分为四大类:1.用于创建对象.2.用于给对象的属性注入值.3.用于改变作用的范围.4.用于定义生命周期.这几个在开发中经常接触到,也可以说每天都会遇见.其中 ...

  2. [POI2006]MET-Subway

    Description 给出一棵N个结点的树,选择L条路径,覆盖这些路径上的结点,使得被覆盖到的结点数最多. Input 第一行两个正整数N.L(2 <= N <= 1,000,000, ...

  3. ATCODER ABC 099

    ATCODER ABC 099 记录一下自己第一场AK的比赛吧...虽然还是被各种踩... 只能说ABC确实是比较容易. A 题目大意 给你一个数(1~1999),让你判断它是不是大于999. Sol ...

  4. http 和 soap 关系 - 转载

    http soap关系 HTTP http:是一个客户端和服务器端请求和应答的标准(TCP).http协议其目的是为了提供一种发布和接收htttp页面的方法 一http协议的客户端与服务器的交互:由H ...

  5. Android -- SQLite 数据库创建,增删改查,事务处理

    1. 概述 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类 ...

  6. scala学习手记24 - 多参数函数值

    上一节的函数值只有一个参数.函数值当然也是可以有多个参数的.看一下下面的inject方法: def inject(arr: Array[Int], initial: Int, operation: ( ...

  7. tech| kafka入门书籍导读

    J梳理了一下自己在入门 kafka 时读过的一些书, 希望能帮助到对 kafka 感兴趣的小伙伴. 涉及到的书籍: kafka 权威指南 Kafka: The Definitive Guide (ka ...

  8. 【疯狂labview】 Xcontrol+LVoop封装练习 Toolbar

    labview没有toolbar,并且没有可复用的 控件 其实项目中很需要 特别是在框架平台的搭建上, 本文以Xcontrol用PICTURE的方式实现toolbar,并用LVoop封装 废话少说 直 ...

  9. cenOs7安装redis

    1.安装redis redis 目前没有官方 RPM 安装包,我们需要从源代码编译,而为了要编译就需要安装 Make 和 GCC. 如果没有安装过 GCC 和 Make,那么就使用 yum 安装 -- ...

  10. 如何在修改bug时切换分支保留修改又不提交

    使用git的时候,我们往往使用branch解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码 co ...