Android 樣式 (style) 和主題(theme)

轉載:https://gold.xitu.io/post/58441c48c59e0d0056a30bc2

樣式和主題

樣式是指為 View 或窗口指定外觀和格式的屬性集合。樣式可以指定高度、填充、字體顏色、字號、背景色等許多屬性。 樣式是在與指定布局的 XML 不同的 XML 資源中進行定義。

Android 中的樣式與網頁設計中層疊樣式表的原理類似 — 您可以通過它將設計與內容分離。

例如,通過使用樣式,您可以將以下布局 XML:

<TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:textColor="#00FF00"android:typeface="monospace"android:text="@string/hello" /> 簡化成這個樣子: <TextView style="@style/CodeFont" android:text="@string/hello" />

布局 XML 中所有與樣式有關的屬性都已移除,并置于一個名為 CodeFont 的樣式定義內,然后通過 style 屬性加以應用。 您會在下文中看到對該樣式的定義。

主題是指對整個 Activity 或應用而不是對單個 View(如上例所示)應用的樣式。 以主題形式應用樣式時,Activity 或應用中的每個視圖都將應用其支持的每個樣式屬性。 例如,您可以 Activity 主題形式應用同一 CodeFont 樣式,之后該 Activity 內的所有文本都將具有綠色固定寬度字體。

定義樣式

要創建一組樣式,請在您的項目的 res/values/ 目錄中保存一個 XML 文件。 可任意指定該 XML 文件的名稱,但它必須使用 .xml 擴展名,并且必須保存在 res/values/ 文件夾內。

該 XML 文件的根節點必須resources。

對于您想創建的每個樣式,向該文件添加一個 style 元素,該元素帶有對樣式進行唯一標識的 name 屬性(該屬性為必需屬性)。然后為該樣式的每個屬性添加一個 item 元素,該元素帶有聲明樣式屬性以及屬性值的 name(該屬性為必需屬性)。 根據樣式屬性,item 的值可以是關鍵字字符串、十六進制顏色值、對另一資源類型的引用或其他值。以下是一個包含單個樣式的示例文件:

<?xml version="1.0" encoding="utf-8"?>
<resources> <style name="CodeFont" parent="@android:style/TextAppearance.Medium"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:textColor">#00FF00</item> <item name="android:typeface">monospace</item> </style> </resources>

resources 元素的每個子項都會在編譯時轉換成一個應用資源對象,該對象可由 style>元素的 name 屬性中的值引用。 可從 XML 布局以 @style/CodeFont 形式引用該示例樣式(如上文引言中所示)。

style 元素中的 parent 屬性是可選屬性,它指定應作為此樣式所繼承屬性來源的另一樣式的資源 ID。 如果愿意,您可在隨后替換這些繼承的樣式屬性。

切記,在 XML 中定義您想用作 Activity 或應用主題的樣式與定義視圖樣式的方法完全相同。 諸如上文所定義的樣式可作為單個視圖的樣式加以應用,也可作為整個 Activity 或應用的主題加以應用。 后文將闡述如何為單個視圖應用樣式或如何以應用主題形式應用樣式。

繼承

您可以通過 style 元素中的 parent 屬性指定應作為您的樣式所繼承屬性來源的樣式。您可以利用它來繼承現有樣式的屬性,然后只定義您想要更改或添加的屬性。 您可以從自行創建的樣式或平臺內建的樣式繼承屬性。 (如需了解有關從 Android 平臺定義的樣式繼承屬性的信息,請參閱下文的使用平臺樣式和主題。) 例如,您可以繼承 Android 平臺的默認文本外觀,然后對其進行修改:

    <style name="GreenText" parent="@android:style/TextAppearance"><item name="android:textColor">#00FF00</item> </style>

如果您想從自行定義的樣式繼承屬性,則不必使用 parent 屬性, 而是只需將您想繼承的樣式的名稱以前綴形式添加到新樣式的名稱之中,并以句點進行分隔。 例如,要創建一個繼承上文定義的 CodeFont 樣式的新樣式,但將顏色設置為紅色,您可以按如下方式創建這個新樣式:

 <style name="CodeFont.Red"><item name="android:textColor">#FF0000</item> </style>

請注意,style 標記中沒有 parent 屬性,但由于 name 屬性以 CodeFont 樣式名稱(這是您創建的一個樣式)開頭,因此這個樣式會繼承該樣式的所有樣式屬性。 這個樣式隨后會替換 android:textColor 屬性,將文本設置為紅色。 您可以 @style/CodeFont.Red 形式引用這個新樣式。

您可以通過使用句點鏈接名稱繼續進行這樣的繼承,次數不限。 例如,您可以通過以下代碼將 CodeFont.Red 擴大:

    <style name="CodeFont.Red.Big"><item name="android:textSize">30sp</item> </style>

這段代碼同時從 CodeFont 和 CodeFont.Red 樣式繼承,然后添加 android:textSize 屬性。

注:這種通過將名稱鏈接起來的繼承方法只適用于由您自己的資源定義的樣式。 您無法通過這種方法繼承 Android 內建樣式。 要引用內建樣式(例如 TextAppearance),您必須使用 parent 屬性。

樣式屬性

既然您已了解了樣式是如何定義的,就需要了解什么類型的樣式屬性(由 item 元素定義)可以使用。您多半已經熟悉了其中的一些,例如 layout_width 和 textColor。 當然,還有許多其他樣式屬性可供您使用。

相應的類引用最便于查找適用于特定 View 的屬性,其中列出了所有支持的 XML 屬性。 例如,TextView XML 屬性表中所列的所有屬性都可在 TextView 元素(或其其中一個子類)的樣式定義中使用。 該引用中列出的其中一個屬性是 android:inputType,因此,如果您正常情況下會在 EditText 元素中放置 android:inputType 屬性,如下所示:

<EditTextandroid:inputType="number"... />
您就可以改為給包括該屬性的 EditText 元素創建一個樣式:<style name="Numbers"><item name="android:inputType">number</item> ... </style>

這樣您的布局 XML 現在便可實現這個樣式:

<EditTextstyle="@style/Numbers"... />

這個簡單示例可能顯得工作量更大,但如果您添加更多樣式屬性并將能夠在各種地方重復使用樣式這一因素考慮在內,就會發現回報可能很豐厚。

如需查看所有可用樣式屬性的參考資料,請參閱 R.attr 參考資料。 切記,所有 View 對象仍然不接受樣式屬性,因此正常情況下您應該引用所支持樣式屬性的具體 View 類。 不過,如果您應用樣式的 View 不支持所有樣式屬性,該 View 將只應用那些受支持的屬性,并直接忽略其他屬性。

不過,某些樣式屬性任何 View 元素都不提供支持,只能以主題形式應用。 這些樣式屬性應用于整個窗口而非任何類型的 View。例如,主題的樣式屬性可以隱藏應用標題、隱藏狀態欄或更改窗口的背景。 這些類型的樣式屬性不屬于任何 View 對象。要發現這些僅主題樣式屬性,請在 R.attr 參考資料中查看有關以 window 開頭的屬性的內容。 例如,windowNoTitle 和 windowBackground 是只有在樣式以主題形式應用于 Activity 或應用時才起作用的樣式屬性。 請參閱下文有關以主題形式應用樣式的信息。

注:別忘了使用 android: 命名空間為每個 item 元素中的屬性名稱添加前綴。

例如:<item name="android:inputType">。

對 UI 應用樣式和主題

設置樣式的方法有兩種:

如果是對單個視圖應用樣式,請為布局 XML 中的 View 元素添加 style 屬性。
或者,如果是對整個 Activity 或應用來應用樣式,請為 Android 清單中的 activity 或 application 元素添加 android:theme 屬性。
當您對布局中的單個 View 應用樣式時,該樣式定義的屬性只應用于該 View。 如果對 ViewGroup 應用樣式,子 View 元素將不會繼承樣式屬性 — 只有被您直接應用樣式的元素才會應用其屬性。 不過,您可以通過以主題形式應用樣式,使所應用的樣式作用于所有 View 元素。

要以主題形式應用樣式定義,您必須在 Android 清單中將樣式應用于 Activity 或應用。 如果您這樣做,Activity 或應用內的每個 View 都將應用其支持的每個屬性。 例如,如果您對某個 Activity 應用前面示例中的 CodeFont 樣式,則所有支持這些文本樣式屬性的 View 元素也會應用這些屬性。 任何不支持這些屬性的 View 都會忽略這些屬性。 如果某個 View 僅支持部分屬性,將只應用這些屬性。

對視圖應用樣式

為 XML 布局中的視圖設置樣式的方法如下:

<

TextViewstyle="@style/CodeFont"android:text="@string/hello" />
現在該 TextView 將按照名為 CodeFont 的樣式的定義設置樣式(請參閱上文定義樣式中的示例)。

注:style 屬性不使用 android: 命名空間前綴。

對 Activity 或應用應用主題
要為您的應用的所有 Activity 設置主題,請打開 AndroidManifest.xml 文件并application 標記,在其中加入帶樣式名稱的 android:theme 屬性。 例如:

<application android:theme="@style/CustomTheme">
如果您只想對應用中的一個 Activity 應用主題,則改為給 <activity> 標記添加 android:theme 屬性。

正如 Android 提供了其他內建資源一樣,有許多預定義主題可供您使用,可免于自行編寫。 例如,您可以使用 Dialog 主題,為您的 Activity 賦予類似對話框的外觀:

<activity android:theme="@android:style/Theme.Dialog">
或者,如果您希望背景是透明的,則可使用 Translucent 主題:<activity android:theme="@android:style/Theme.Translucent">

如果您喜歡某個主題,但想做些調整,只需將該主題添加為您的自定義主題的 parent。 例如,您可以像下面這樣對傳統明亮主題進行修改,使用您自己的顏色:

<color name="custom_theme_color">#b0b0ff</color>
<style name="CustomTheme" parent="android:Theme.Light"><item name="android:windowBackground">@color/custom_theme_color</item><item name="android:colorBackground">@color/custom_theme_color</item>
</style>

(請注意,此處顏色需要以單獨資源形式提供,因為 android:windowBackground 屬性僅支持對另一資源的引用;不同于 android:colorBackground,無法為其提供顏色字面量。)

現在,在 Android 清單內使用 CustomTheme 替代 Theme.Light:

<activity android:theme="@style/CustomTheme">

根據平臺版本選擇主題
新版本的 Android 可為應用提供更多主題,您可能希望在這些平臺上運行時可以使用這些新增主題,同時仍可兼容舊版本。 您可以通過自定義主題來實現這一目的,該主題根據平臺版本利用資源選擇在不同父主題之間切換。

例如,以下這個聲明所對應的自定義主題就是標準的平臺默認明亮主題。 它位于 res/values 之下的一個 XML 文件(通常是 res/values/styles.xml)中:

<style name="LightThemeSelector" parent="android:Theme.Light">...
</style>
為了讓該主題在應用運行在 Android 3.0(API 級別 11)或更高版本系統上時使用更新的全息主題,您可以在 res/values-v11 下的 XML 文件中加入一個替代主題聲明,但將父主題設置為全息主題:<style name="LightThemeSelector" parent="android:Theme.Holo.Light">...
</style>

現在像您使用任何其他主題那樣使用該主題,您的應用將在其運行于 Android 3.0 或更高版本的系統上時自動切換到全息主題。

R.styleable.Theme?提供了可在主題中使用的標準屬性的列表。

如需了解有關根據平臺版本或其他設備配置提供備用資源(例如主題和布局)的詳細信息,請參閱提供資源文檔。

使用平臺樣式和主題

Android 平臺提供了龐大的樣式和主題集合,供您在應用中使用。 您可以在 R.style 類中找到所有可用樣式的參考資料。 要使用此處所列樣式,請將樣式名稱中的所有下劃線替換為句點。 例如,您可以使用 "@android:style/Theme.NoTitleBar" 應用 Theme_NoTitleBar 主題。

不過,R.style 參考資料并不完備,未對樣式做全面說明,因此查看這些樣式和主題的實際源代碼可讓您更清楚地了解每個樣式提供的樣式屬性。如需查看更詳實的 Android 樣式和主題參考資料,請參閱以下源代碼:
Android 樣式 (styles.xml)
Android 主題 (themes.xml)

轉載于:https://www.cnblogs.com/benchao/p/6160872.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371864.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371864.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371864.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自定義控件_VIewPager顯示多個Item

一直以來想搞明白這個不完全的VIewPager是怎么做到的&#xff0c;有幸看到這片篇文章 有二種實現方法 1.設置的屬性 1.clipChildren屬性 2.setPageMargin 3.更新Item外界面 2.重寫getPageWidth public class MultiplePagerAdapter extends PagerAdapter { private List<I…

華為怎么改輸入法皮膚_微信和QQ個性鍵盤皮膚

hello大家好&#xff0c;今天是2019年1月1號&#xff0c;祝大家新年快樂今天是新年的第一天&#xff0c;所以說給大家介紹一個好玩的&#xff0c;微信和QQ都能設置的個性的鍵盤皮膚&#xff0c;看下圖&#xff0c;這樣的個性的鍵盤主題怎么設置呢&#xff1f;其實很簡單&#x…

EasyMock教程–入門

在本文中&#xff0c;我將向您展示EasyMock是什么&#xff0c;以及如何使用它來測試Java應用程序。 為此&#xff0c;我將創建一個簡單的Portfolio應用程序&#xff0c;并使用JUnit&#xff06;EasyMock庫對其進行測試。 在開始之前&#xff0c;讓我們首先了解使用EasyMock的需…

synchronized內置鎖

synchronized內置鎖&#xff0c;如果發生阻塞&#xff0c;無法被中斷&#xff0c;除非關閉jvm.因此不能從死鎖中恢復。轉載于:https://www.cnblogs.com/paulbai/p/6163250.html

如何加快Json 序列化?有哪些方法?

1、使用阿里的fastjson 2、可以通過去除不必要屬性加快序列化。如person對象&#xff0c;有id&#xff0c;name&#xff0c;address&#xff0c;我json需要用戶姓名&#xff0c;此時序列化的時候就只序列化name&#xff0c;id和address不序列化。轉載于:https://www.cnblogs.co…

用金萬維怎么設置路由器_家用路由器怎么設置 家庭路由器設置方法【圖文】...

這里以TP-link的無線路由器為例&#xff0c;教一下怎么調試路由器上網。準備工具:網線兩條&#xff0c;電腦或者手機&#xff0c;用手機的話就不需要用網線了1、用網線連接光纖貓與路由器&#xff0c;光貓的LAN1口與路由器的WAN相連。路由器的LAN任意一個口用網線連接電腦。2、…

Liferay –簡單主題開發

實際上&#xff0c;Liferay的6.1版本已經走了很長一段路&#xff0c;該版本完全支持JSF和IceFaces。 我的目標是使它成為我們團隊中的標準協作工具&#xff0c;因此我仍在嘗試學習它的精髓。 好的軟件應用程序可以解決問題&#xff0c;但是好的軟件應用程序不僅可以解決問題&am…

springmvc初步配置

導包/添加依賴&#xff1a;<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springfram…

獲取用戶地理位置

1、利用h5 屬性獲取用戶地理位置 h5的新增屬性是支持用戶獲取地理位置的特別是手機&#xff0c;支持的情況會更好。具體寫法如下 // 定位功能getLocation () {if (navigator.geolocation) {navigator.geolocation.getCurrentPosition(showPosition, showError);} else {alert(瀏…

行號 設置vim_在VSCode里面配置Vim正確姿勢(細節解析)

一、導論對于不用vim的人來說&#xff0c;vim簡直是個噩夢&#xff0c;復雜的指令、丑陋的界面、令人頭痛的配置文件&#xff0c;任何一項都足以勸退一大波人&#xff0c;但是對于已經習慣了使用vim的人來說&#xff0c;vim簡直就是馬良神筆&#xff0c;似乎vim除了生孩子什么都…

使用Spring 3 MVC處理表單驗證

本文是有關Spring 3的系列文章的一部分。該系列的早期文章是使用Spring 3 MVC的Hello World和使用Spring 3 MVC的 Handling Forms 。 現在讓我們更深入地研究Spring。 在本文中&#xff0c;我們將學習驗證從表單中獲取的數據。 讓我們更仔細地看一下驗證任務。 場景1 &#xf…

當事人角色 變更映射策略引起的問題

IBeamMDAA V2版本中&#xff0c;由于變更了 當事人角色 的繼承機制&#xff0c;在添加 當事人角色時&#xff0c;為了 構建 當事人-當事人角色之間的關系&#xff0c;代碼如下&#xff1a;//if (party.PartyRoles ! null && !party.PartyRoles.Contains(sysUser))//{//…

vs xxxxx nuget配置無效

重啟vs轉載于:https://www.cnblogs.com/zinan/p/7080668.html

巡回沙龍_美浮特全國巡回沙龍第一期結束撒花!

科技美膚&#xff0c;無齡煥變。美浮特2019全國美膚巡回沙龍第一期活動圓滿結束&#xff01;優秀的小伙伴&#xff0c;雅致的茶歇環境&#xff0c;精美的甜點小食&#xff0c;理論與體驗并行的膚感測試課堂……不知道是哪一個環節給大家留下了深刻的印象呢&#xff1f;首先讓我…

Spring與網關的集成

這是有關Spring Integration系列的第二篇文章。 本文以我們介紹Spring Integration的第一篇文章為基礎。 上下文設置 在第一篇文章中&#xff0c;我們創建了一個簡單的Java應用程序&#xff0c;其中 通過頻道發送了一條消息&#xff0c; 它被服務&#xff08;即POJO&#xf…

UIAutomation識別UI元素

MS UI Automation&#xff08;Microsoft User Interface Automation&#xff1a;UIA&#xff09;是隨.net framework3.0一起發布的&#xff0c;雖然在如今這個幾乎每天都有各種新名詞、新技術出來的所謂的21世紀&#xff0c;它顯得已經有些過時了。前些日子&#xff0c;正好一個…

【C++第一個Demo】---控制臺RPG游戲3【登陸菜單樹】

【登陸系統--樹結構】 1 首先我這里設計&#xff0c;由一個基類MainMenu構建樹結構&#xff0c;并實現控制臺上菜單之間的切換和返回操作 1 #ifndef _UI_BASE_H_2 #define _UI_BASE_H_3 4 #include <string>5 #include <vector>6 #include"..//Marco.h"7…

不存在_施文忠 | ”存在“與“不存在”——巴蜀文明概論

海德格爾有句名言&#xff1a;“存在者存在&#xff0c;不存在者不存在&#xff01;”四川&#xff0c;一個偉大的存在&#xff0c;偏偏存在于四川的口頭禪卻是“不存在”。在不存在中追求存在&#xff0c;在存在中擺脫存在。六月白鹿鎮&#xff0c;書院學習了《李白與海德格爾…

Spring和JSF集成:異常處理

大多數JSF開發人員都會熟悉“發生錯誤”頁面&#xff0c;當在他們的代碼某處引發意外異常時&#xff0c;該頁面就會顯示。 該頁面在開發時確實很有用&#xff0c;但對于生產應用程序通常不是您想要的。 通常&#xff0c;在用庫存JSF替換此頁面時&#xff0c;您有兩種選擇。 您可…

Altium 原理圖出現元件“Extra Pin…in Normal of part ”警告的解決方法

轉載于&#xff1a; http://blog.csdn.net/idoming/article/details/45575627 使用Altium Designer的時候編譯完后&#xff0c;只關注過錯誤沒有關注過警告&#xff0c;現在認真排查一下有哪些警告。 正在進行的項目原理圖編譯完成后提示標題中的警告信息。經過在網上搜索&…