您的位置:首页 > 移动开发 > Android开发

Android系统自带样式(android:theme)

2016-04-25 21:13 603 查看
From: http://blog.csdn.net/dawanganban/article/details/17732701 http://www.cnblogs.com/bluestorm/archive/2012/07/12/2588724.html
android:theme="@android:style/Theme.Dialog" : Activity显示为对话框模式

android:theme="@android:style/Theme.NoTitleBar" : 不显示应用程序标题栏

android:theme="@android:style/Theme.NoTitleBar.Fullscreen" : 不显示应用程序标题栏,并全屏

android:theme="Theme.Light ": 背景为白色

android:theme="Theme.Light.NoTitleBar" : 白色背景并无标题栏

android:theme="Theme.Light.NoTitleBar.Fullscreen" : 白色背景,无标题栏,全屏

android:theme="Theme.Black" : 背景黑色

android:theme="Theme.Black.NoTitleBar" : 黑色背景并无标题栏

android:theme="Theme.Black.NoTitleBar.Fullscreen" : 黑色背景,无标题栏,全屏

android:theme="Theme.Wallpaper" : 用系统桌面为应用程序背景

android:theme="Theme.Wallpaper.NoTitleBar" : 用系统桌面为应用程序背景,且无标题栏

android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen" : 用系统桌面为应用程序背景,无标题栏,全屏

android:theme="Theme.Translucent : 透明背景

android:theme="Theme.Translucent.NoTitleBar" : 透明背景并无标题

android:theme="Theme.Translucent.NoTitleBar.Fullscreen" : 透明背景并无标题,全屏

android:theme="Theme.Panel ": 面板风格显示

android:theme="Theme.Light.Panel" : 平板风格显示

还记得在Android菜鸟的成长笔记(3)中我们曾经遇到了一个问题吗?"这个界面和真真的QQ界面还有点不同的就是上面的标题myFirstApp,怎么去掉这个标题呢?",当时我直接在AndroidMainfest.xml中添加了一个属性:

android:theme"@android:style/Theme.NoTitleBar"

可能有的朋友就会迷惑了,为什么添加了这个属性就可以了。这一篇文章将让我们一起翻开Android系统源代码来揭开困扰大家的关于主题使用以及自定义的谜团。

一、样式(Style)与主题(Theme)

在Android的应用的资源文件中有一个style.xml文件,这个文
件是干什么用的呢?我们有时候经常需要对某个类型的组件指定大致相似的格式,比如字体、颜色、背景色等,如果我们每次都为某个View组件去重复指定这些
属性,这无疑会产生大量的工作,而且还不利于后期的代码修改和维护。而Style就是一个样式的格式,这个格式可以被多个View组件所使用,也可以说是
一个样式的集合类,被需要这一类样式集合的View组件所使用。例如我们前面写的QQ登录界面中的登录按钮,我们可以给定义一个样式

<stylename"buttonStyle">
<itemname"android:background"></item>
<itemname"android:textColor"></item>
</style>

在布局文件中引入样式

<Button
android:layout_width"270dip"
android:layout_height"40dip"
android:text"@string/login_button"
style"@style/buttonStyle"
/>

与样式非常相似,主题资源的xml文件通常也放在/res/values目录下,主题相当于整个应用或者某个Activity的样式,换句话说主题是针对窗体级别或整个应用程序的样式。与样式比较,样式是针对窗体内元素的样式。主题的设置有两种方式

(1)在AndroidMainfest.xml中为Activity或者application指定主题

<application
android:allowBackup"true"
android:icon"@drawable/ic_launcher"
android:label"@string/app_name"
android:theme"@android:style/Theme.NoTitleBar">
<activity
android:name"com.example.myfirstapp.MainActivity"
android:label"@string/app_name">
<intent-filter>
<actionandroid:name"android.intent.action.MAIN"/>

<categoryandroid:name"android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>

上面AndroidMainfest.xml代码中给整个应用指定了一个主题,这个主题是没有标题栏的系统主题。

(2)在Activity创建时调用 setTheme方法(必须在setContentView前面调用)来给某个Activity添加主题。

二、剖析主题(Theme)资源

我们先来创建一个工程名字为helloworld,然后打开它的AndroiodMainfest.xml文件

<application
android:allowBackup"true"
android:icon"@drawable/ic_launcher"
android:label"@string/app_name"
android:theme"@style/AppTheme">
<activity
android:name"com.example.helloworld.MainActivity"
android:label"@string/app_name">
<intent-filter>
<actionandroid:name"android.intent.action.MAIN"/>

<categoryandroid:name"android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>

可以看到我们在创建工程时,已经默认给我们的整个应用添加了一个主题

android:theme"@style/AppTheme"

打开我们资源文件res/values/下面的styles.xml文件,可以看到在样式文件中有一个名字为AppTheme的样式,如下:

<resources>

>
<stylename"AppBaseTheme"parent"android:Theme.Light">

>
</style>

<!-- Application theme. -->
<stylename"AppTheme"parent"AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>

</resources>

我们可以看到,这个AppTheme的样式继承自上面的AppBaseTheme。而AppBaseTheme又继承自系统的一个样式Theme.Light,打开Android系统源代码找到Theme.xml文件中的Theme.Light如下:

>
<stylename"Theme.Light">
<itemname"windowBackground"></item>
<itemname"colorBackground"></item>
<itemname"colorForeground"></item>
<itemname"colorForegroundInverse"></item>

<itemname"textColorPrimary"></item>
<itemname"textColorSecondary"></item>
<itemname"textColorTertiary"></item>
<itemname"textColorPrimaryInverse"></item>
<itemname"textColorSecondaryInverse"></item>
<itemname"textColorTertiaryInverse"></item>
<itemname"textColorPrimaryDisableOnly"></item>
<itemname"textColorPrimaryInverseDisableOnly"></item>
<itemname"textColorPrimaryNoDisable"></item>
<itemname"textColorSecondaryNoDisable"></item>
<itemname"textColorPrimaryInverseNoDisable"></item>
<itemname"textColorSecondaryInverseNoDisable"></item>
<itemname"textColorHint"></item>
<itemname"textColorHintInverse"></item>

<itemname"popupWindowStyle"></item>

<itemname"textCheckMark"></item>
<itemname"textCheckMarkInverse"></item>

<itemname"gestureOverlayViewStyle"></item>
<itemname"expandableListViewStyle"></item>
<itemname"listViewStyle"></item>
<itemname"listDivider"></item>
<itemname"listSeparatorTextViewStyle"></item>

<itemname"progressBarStyle"></item>
<itemname"progressBarStyleSmall"></item>
<itemname"progressBarStyleLarge"></item>
<itemname"progressBarStyleInverse"></item>
<itemname"progressBarStyleSmallInverse"></item>
<itemname"progressBarStyleLargeInverse"></item>
</style>


式的继承有两种方式,一种是上面看到的parent="",还有一种就是用”."的方式,上面的Theme.Light继承自Theme。这两种继承有什
么区别呢?一个相当于咱们类之间的继承extend,另一个相当于内部类,也可以使用外部类的属性和方法。我们再来看看Theme.Light的父类
Theme的样式定义。

<stylename"Theme">

<itemname"colorForeground"></item>
<itemname"colorForegroundInverse"></item>
<itemname"colorBackground"></item>
<itemname"colorBackgroundCacheHint"></item>
<itemname"disabledAlpha"></item>
<itemname"backgroundDimAmount"></item>

<!-- Text styles -->
<itemname"textAppearance"></item>
<itemname"textAppearanceInverse"></item>

<itemname"textColorPrimary"></item>
<itemname"textColorSecondary"></item>
<itemname"textColorTertiary"></item>
<itemname"textColorPrimaryInverse"></item>
<itemname"textColorSecondaryInverse"></item>
<itemname"textColorTertiaryInverse"></item>
<itemname"textColorPrimaryDisableOnly"></item>
<itemname"textColorPrimaryInverseDisableOnly"></item>
<itemname"textColorPrimaryNoDisable"></item>
<itemname"textColorSecondaryNoDisable"></item>
<itemname"textColorPrimaryInverseNoDisable"></item>
<itemname"textColorSecondaryInverseNoDisable"></item>
<itemname"textColorHint"></item>
<itemname"textColorHintInverse"></item>
<itemname"textColorSearchUrl"></item>

<itemname"textAppearanceLarge"></item>
<itemname"textAppearanceMedium"></item>
<itemname"textAppearanceSmall"></item>
<itemname"textAppearanceLargeInverse"></item>
<itemname"textAppearanceMediumInverse"></item>
<itemname"textAppearanceSmallInverse"></item>
<itemname"textAppearanceSearchResultTitle"></item>
<itemname"textAppearanceSearchResultSubtitle"></item>

<itemname"textAppearanceButton"></item>

<itemname"candidatesTextStyleSpans"></item>

<itemname"textCheckMark"></item>
<itemname"textCheckMarkInverse"></item>

<!-- Button styles -->
<itemname"buttonStyle"></item>

<itemname"buttonStyleSmall"></item>
<itemname"buttonStyleInset"></item>

<itemname"buttonStyleToggle"></item>

<!-- List attributes -->
<itemname"listPreferredItemHeight"></item>
<!-- @hide -->
<itemname"searchResultListItemHeight"></item>
<itemname"listDivider"></item>
<itemname"listSeparatorTextViewStyle"></item>

<itemname"listChoiceIndicatorSingle"></item>
<itemname"listChoiceIndicatorMultiple"></item>

<itemname"expandableListPreferredItemPaddingLeft"></item>
<itemname"expandableListPreferredChildPaddingLeft">
</item>

<itemname"expandableListPreferredItemIndicatorLeft"></item>
<itemname"expandableListPreferredItemIndicatorRight"></item>
<itemname"expandableListPreferredChildIndicatorLeft">
</item>
<itemname"expandableListPreferredChildIndicatorRight">
</item>

<!-- Gallery attributes -->
<itemname"galleryItemBackground"></item>

<!-- Window attributes -->
<itemname"windowBackground"></item>
<itemname"windowFrame"></item>
<itemname"windowNoTitle"></item>
<itemname"windowFullscreen"></item>
<itemname"windowIsFloating"></item>
<itemname"windowContentOverlay"></item>
<itemname"windowShowWallpaper"></item>
<itemname"windowTitleStyle"></item>
<itemname"windowTitleSize"></item>
<itemname"windowTitleBackgroundStyle"></item>
<itemname"android:windowAnimationStyle"></item>
<itemname"android:windowSoftInputMode"></item>

<!-- Dialog attributes -->
<itemname"alertDialogStyle"></item>

<!-- Panel attributes -->
<itemname"panelBackground"></item>
<itemname"panelFullBackground"></item>
<!-- These three attributes do not seems to be used by the framework. Declared public though -->
<itemname"panelColorBackground"></item>
<itemname"panelColorForeground"></item>
<itemname"panelTextAppearance"></item>

<!-- Scrollbar attributes -->
<itemname"scrollbarFadeDuration"></item>
<itemname"scrollbarDefaultDelayBeforeFade"></item>
<itemname"scrollbarSize"></item>
<itemname"scrollbarThumbHorizontal"></item>
<itemname"scrollbarThumbVertical"></item>
<itemname"scrollbarTrackHorizontal"></item>
<itemname"scrollbarTrackVertical"></item>

<!-- Text selection handle attributes -->
<itemname"textSelectHandleLeft"></item>
<itemname"textSelectHandleRight"></item>
<itemname"textSelectHandle"></item>
<itemname"textSelectHandleWindowStyle"></item>

<!-- Widget styles -->
<itemname"absListViewStyle"></item>
<itemname"autoCompleteTextViewStyle"></item>
<itemname"checkboxStyle"></item>
<itemname"dropDownListViewStyle"></item>
<itemname"editTextStyle"></item>
<itemname"expandableListViewStyle"></item>
<itemname"expandableListViewWhiteStyle"></item>
<itemname"galleryStyle"></item>
<itemname"gestureOverlayViewStyle"></item>
<itemname"gridViewStyle"></item>
<itemname"imageButtonStyle"></item>
<itemname"imageWellStyle"></item>
<itemname"listViewStyle"></item>
<itemname"listViewWhiteStyle"></item>
<itemname"popupWindowStyle"></item>
<itemname"progressBarStyle"></item>
<itemname"progressBarStyleHorizontal"></item>
<itemname"progressBarStyleSmall"></item>
<itemname"progressBarStyleSmallTitle"></item>
<itemname"progressBarStyleLarge"></item>
<itemname"progressBarStyleInverse"></item>
<itemname"progressBarStyleSmallInverse"></item>
<itemname"progressBarStyleLargeInverse"></item>
<itemname"seekBarStyle"></item>
<itemname"ratingBarStyle"></item>
<itemname"ratingBarStyleIndicator"></item>
<itemname"ratingBarStyleSmall"></item>
<itemname"radioButtonStyle"></item>
<itemname"scrollViewStyle"></item>
<itemname"horizontalScrollViewStyle"></item>
<itemname"spinnerStyle"></item>
<itemname"starStyle"></item>
<itemname"tabWidgetStyle"></item>
<itemname"textViewStyle"></item>
<itemname"webTextViewStyle"></item>
<itemname"webViewStyle"></item>
<itemname"dropDownItemStyle"></item>
<itemname"spinnerDropDownItemStyle"></item>
<itemname"spinnerItemStyle"></item>
<itemname"dropDownHintAppearance"></item>
<itemname"keyboardViewStyle"></item>
<itemname"quickContactBadgeStyleWindowSmall"></item>
<itemname"quickContactBadgeStyleWindowMedium"></item>
<itemname"quickContactBadgeStyleWindowLarge"></item>
<itemname"quickContactBadgeStyleSmallWindowSmall"></item>
<itemname"quickContactBadgeStyleSmallWindowMedium"></item>
<itemname"quickContactBadgeStyleSmallWindowLarge"></item>

<!-- Preference styles -->
<itemname"preferenceScreenStyle"></item>
<itemname"preferenceCategoryStyle"></item>
<itemname"preferenceStyle"></item>
<itemname"preferenceInformationStyle"></item>
<itemname"checkBoxPreferenceStyle"></item>
<itemname"yesNoPreferenceStyle"></item>
<itemname"dialogPreferenceStyle"></item>
<itemname"editTextPreferenceStyle"></item>
<itemname"ringtonePreferenceStyle"></item>
<itemname"preferenceLayoutChild"></item>

<!-- Search widget styles -->
<itemname"searchWidgetCorpusItemBackground"></item>
</style>


们可以看到里面定义了关于我们整个应用中文字的样式,按钮的样式,列表的样式,画廊的样式,窗体的样式,对话框的样式等。这个样式是系统的默认样式,也是
最符合HOLO的样式。Theme中定义的是最基本的主题样式,Theme的样式扩展样式有我们上面的Theme.Light还有
Theme.NoTitleBar、Theme.NoTitleBar.Fullscreen、Theme.Light.NoTitleBar、
Theme.Light.NoTitleBar.Fullscreen、Theme.Black、......

三、自定义主题

有了上面对Theme的了解之后,下面我们通过改变标题栏来自定义主题样式,首先继承Theme,标题栏是与窗体样式(Window attributes)相关的样式,我们在Theme.xml中找到这几句代码.

<!-- Window attributes -->
<itemname"windowBackground"></item>
<itemname"windowFrame"></item>
<itemname"windowNoTitle"></item>
<itemname"windowFullscreen"></item>
<itemname"windowIsFloating"></item>
<itemname"windowContentOverlay"></item>
<itemname"windowShowWallpaper"></item>
<itemname"windowTitleStyle"></item>
<itemname"windowTitleSize"></item>
<itemname"windowTitleBackgroundStyle"></item>
<itemname"android:windowAnimationStyle"></item>
<itemname"android:windowSoftInputMode"></item>

将上面主题中Title的大小和背景覆盖

<!-- 自定义的主题样式 -->
<stylename"myTheme"parent"android:Theme">
<itemname"android:windowTitleBackgroundStyle"></item>
<itemname"android:windowTitleSize"></item>
</style>

<!-- 主题中Title的背景样式 -->
<stylename"myThemeStyle">
<itemname"android:background"></item>
</style>

默认主题样式



自定义主题样式

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: