Android指南 - 樣式和主題

来源:http://www.cnblogs.com/shouce/archive/2016/04/20/5411074.html
-Advertisement-
Play Games

樣式和主題(Styles and Themes) 一個樣式(Style)是一個包含了指定樣子和格式的作用於視圖控制項(View)或者窗體(Window)屬性集合。一個style可以指定很多屬性,比如 高度,填充,字體顏色,字體尺寸,背景色等。一個Style在xml資源文件中定義,並且和在xml中指定的 ...


樣式和主題(Styles and Themes)

一個樣式(Style)是一個包含了指定樣子和格式的作用於視圖控制項(View)或者窗體(Window)屬性集合。一個style可以指定很多屬性,比如 高度,填充,字體顏色,字體尺寸,背景色等。一個Style在xml資源文件中定義,並且和在xml中指定的佈局區分開來。

 

在Android里的樣式和Web設計中的CSS共用一個相似的原理,它們允許你分離設計(Design)和內容(Content).

 

舉個例子,通過使用一個style,你可以讓你的佈局xml像下麵這樣:

 

<TextView
    android: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" />

所有關聯到style的屬性已經在佈局xml中被刪除了,並且放在一個叫做“CodeFont”style中定義了。它通過一個style屬性被應用上。在下麵的章節,你將會看到如何定義style。

 

一個主題(Theme)也是一個style,它被應用在所有的Activity或者application上,而不是個別的視圖控制項(View)(像上面的示例一樣)。當一個style被當做一個theme來應用,每一個activity或者application中的視圖控制項將應用每一個它支持的樣式屬性。比如,你可以在activity上使用相同的CodeFont樣式作為一個theme,這時Activity里的所有內部字體將會變成CodeFont樣式的字體樣式變成綠色的等寬字體。

 

定義一個樣式Style

為了創建一些樣式,你可以保存在你的工程下的 res/Values/ 文件夾下的一個XML文件中。XML文件的名字是隨意的,但是必須擴展名是 .xml 並且存放在 res/Values/ 文件夾下。

 

XML文件的根節點必須是<resources>

 

為你創建的每個樣式,添加一個<style>元素,並且需要一個name  屬性,它標識唯一性而且是必需的屬性。再為你的樣式屬性都添加進去,通過添加<item>元素來做,使用一個在樣式屬性里聲明的name屬性和一個value屬性,這兩個都是必需的。<item>的value屬性可以是一個關鍵字字元串,一個16進位的顏色描述,一個其他資源類型的引用,或者在其他樣式屬性中依賴的value。下麵是一個簡單的示例樣式文件內容:

複製代碼
<?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屬性的值(value)來被引用引用。這個示例樣式可以在XML佈局中被引用,比如“@style/CodeFont”(像上面介紹的示例一樣)。

 

在<style>元素中的parent屬性是可選的並且指向一個其他樣式中的資源ID,它可以從這個樣式中繼承一些屬性。合適的話,你可以重寫(override)繼承到的屬性。

 

記住,一個你想在activity或者application中使用的樣式都被在XML文件中定義,並且所有的視圖控制項具有相同的樣式。一個樣式,比如上面定義的那個,可以被作為一style應用的單一的視圖控制項上或者被作為一個theme應用在全部的activity或者application上。如何應用的單一的視圖或者作為應用的主題,我們稍後討論。

 

繼承

在<style>中的parent屬性讓你可以指定一個你可以繼承其屬性的樣式。你可以使用這個從一個已經存在的樣式中繼承屬性,並且定義一些獨有的你需要改變或者添加的屬性。你可以繼承那些來自你已經自行創建的樣式或者或者繼承自在平臺里構建好的樣式(See Using Platform Styles and Themes,下麵,獲得關於繼承安卓平臺樣式的更多信息)。比如,你可以繼承安卓平臺預設的字體樣式並且修改它,比如:

  <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 屬性

 

註意:這樣的通過鏈接名稱的方式來繼承的方法,僅僅能用於你自己定義的資源文件中的樣式。你不能用於繼承安卓內置的樣式。要想引用內置的樣式,比如TextAppearance,,你必須使用parent屬性。

 

樣式屬性

現在,你明白瞭如何定義一個樣式,你需要去學會 在<item>元素下什麼類型被定義的樣式屬性是可用的。你可能已經熟悉了很多已經有的,比如layout_width 和 textColor. 當然,還有很多的樣式屬性你可以使用。

 

尋找可以應用在指定視圖控制項上的屬性的最好的地方是 相應的類引用,它列出了所有支持的XML屬性。比如所有在表格 TextView XML attributes 中列出的屬性,都可以應用在一個樣式的定義中作用在TextView元素上(或者它的子類)。在 引用 中被列出的一個屬性叫做android:inputType的,這樣你可以再<EditText>元素中應用這個屬性,像下麵這樣:

<EditText
    android:inputType="number"
    ... />

你可以為EditText 元素創建一個樣式,包含這個屬性,來代替上面:

<style name="Numbers">
  <item name="android:inputType">number</item>
  ...
</style>

這樣你的佈局用的XML能夠這樣實現樣式:
<EditText
    style="@style/Numbers"
    ... />

這個簡單的示例看起來多做了一些工作,不過當你添加更多的樣式屬性並且把在多處可重用樣式的能力作為參考因素的話,你的付出將是值得的。

 

獲得所有可用樣式的屬性的引用(reference),請參閱 R.attr 引用。記住,所有的視圖控制項對象不接受所有相同的屬性,這樣你可以平常的引用圖為視圖控制項類指定支持的樣式屬性。然而,如果你為某個視圖控制項應用了一個樣式,這個樣式包含的屬性中不是都被支持的,視圖控制項將會應用那些屬性中的可被支持的並且簡單的忽略其他的。

 

一些樣式屬性,不被支持在視圖控制項里使用,僅僅能作為主題使用。那些樣式屬性應用在所有的窗體上,不能用在任何視圖控制項上。比如有些樣式屬性可以隱藏應用程式的標題,隱藏狀態條,或者更改窗體的背景。那些類型的樣式屬性不屬於任何視圖控制項對象。要發現更多 僅僅作用於theme主題 的屬性,查看R.attr 引用中的以windows開始的屬性。比如,windowNoTitle 和 windowBackground 屬性只能在應用於activity和application時發生作用。參閱下一章節可以獲得更多“在theme中應用樣式”的內容。

 

註意:在<item>元素中,不要忘記寫屬性名稱的首碼  android: ,這是一個命名空間,比如:<item name="android:inputType">.

 

在UI上應用樣式和主題

有兩種方式設置一個樣式:

  • 為單個視圖控制項指定樣式,在XML佈局文件中的視圖元素上添加style屬性。
  • 為整個activity或者application指定樣式,在manifest.xml中的<activity>或者<application>節點元素中添加 android:theme 屬性。

當你為佈局里的單個控制項中應用一個樣式,你的樣式中定義的屬性都會應用在這個視圖組件中。如果你的樣式應用在一個ViewGroup中,它的所有子控制項元素將不能繼承這些樣式的屬性,只有你直接指定的那個視圖元素可以應用這些屬性。不過,你仍然可以通過主題的方式為你的應用下的所有視圖元素應用樣式。

 

要想應用一個主題,你必須在manifest.xml中為activity或者aplication上應用樣式。當你這麼做,每一個Activity或者aplication里的視圖元素都將應用這些樣式中它支持的屬性。比如,如果應用上面提到的CodeFont樣式在一個Activity上,這是所有的支持文本樣式屬性的視圖元素將應用它們。一些不支持這些屬性的視圖元素將忽略它們。如果一個視圖支持一部分屬性,那麼它將只應用這些屬性。

 

在視圖元素中應用樣式

下麵演示如何在XML佈局中設置一個樣式:

<TextView
    style="@style/CodeFont"
    android:text="@string/hello" />

現在 TextView將具有樣式,像CodeFont定義的屬性描述的一樣。你可以參考上面的示例。

註意:樣式style 不需要使用androidoi: 命名空間首碼。

 

在activity或者application中應用樣式

要想再你的所有activity或者application上使用樣式,打開  AndroidManifest.xml 並且修改<application>標簽,讓它包含 android:theme 屬性並指定一個樣式名稱,比如:

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

如果你想為你的應用中的某個activity使用樣式,那麼添加 android:theme 到你的<activity>標簽中。

安卓提供了一些內置資源,你可以使用這些預先定義好的樣式,而不用自己再重新寫了。比如,你可以使用Dialog主題讓你的Activity 表現的像一個 對話框:

<activity android:theme="@android:style/Theme.Dialog">

或者你想讓你的背景透明,使用 透明主題:

<activity android:theme="@android:style/Theme.Translucent">

如果你喜歡主題,但是想開足馬力使用它,那麼你可以添加它到你的自定義主題中的parent屬性上繼承它。比如,你可以修改 傳統的 light theme 主題並使用你的自己的顏色,像下麵這樣:

<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屬性可以指定一個顏色描述文本。

現在,在你的Mnaifest文件中,可以使用  CustomTheme 代替 Theme.Light:

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

 

選擇一個平臺支持的樣式作為基礎

安卓較新的版本為應用提供了額外的可用的樣式,同時你可能想要使用它們在那些平臺上運行,並且仍然和老版本保持相容。你可以通過自定樣式做到,使用“資源選擇器"來切換不同的父主題,基於平臺版本。

比如,下麵是一個自定義樣式的聲明,這個樣式是個簡單的標準平臺預設的 light theme主題。它可能被放置在res/valeus文件夾下的 XML文件中(經典的是在 res/values/styles.xml)。

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

當應用跑在Android 3.0(API級別11)或者更高以上時,可以讓這個樣式使用較為新一些的holo風格主題,你可以放置一個可供選擇的聲明樣式防止在res/values-v11這個文件夾下的XML文件中,但是讓這個樣式繼承自 holo風格的主題:

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

 

現在可以像任意其他那樣來使用這個主題,並且當跑在安卓3.0以上時,你的應用程式會自動切換到holo風格的主題。

在 R.styleable.Theme. 里,可以找到一個標準的屬性列表供你使用。

關於更多的信息,像比如主題和佈局,基於平臺版本或者設備配置等切換資源文件選擇,你可以閱讀 Providing Resources 。

 

使用平臺樣式和主題

安卓平臺提供了很多樣式和主題,供你在應用程式中使用。在  R.style  類里你可以找到可以用的引用。為了使用這裡列出的樣式,你可以使用”點“替換所有的下劃線分割的 樣式名稱,比如,你可以通過”"@android:style/Theme.NoTitleBar".來使用 Theme_NoTitleBar 樣式。

 

 R.style 引用,然而,不是和好的文件記錄,並且不能全面的描述樣式,那麼查看那些樣式和主題的實際的資源代碼可以給你更好一些關於”各個被提供樣式屬性“的的理解。獲得更多關於樣式和主題的引用,你可以看下麵的源代碼:

 

那些文件將通過實例幫助你學習。比如,在安卓的主題源代碼中,你將找到一個聲明  <style name="Theme.Dialog">.在這些定義里,你將會看到所有的常常用到的 ”被用於安卓框架的樣式對話框的屬性“

 

更多關於 樣式和主題 在XML中的語法的信息,請參閱  Style Resource 文檔。

 

對於 一個可用的樣式屬性的引用,你可以它使用定義一個樣式或者主題(比如"windowBackground" 或者 "textAppearance),在你創建一個樣式時你可以閱讀 R.attr 或者各自的視圖類。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如題,這是最近在修改一個數據同步模塊時發現的問題。整個數據同步的任務是在App啟動後放在一個後臺執行的線程中的,執行某個單條數據同步任務成功後,會使用 Objective-c代碼 [self performSelector:(nonnull SEL) withObject:(nullable id) ...
  • 點擊鏈接,下載報告原文:http://bbs.tingyun.com/forum.php?mod=viewthread&tid=136 2015 年,可以說是移動應用生態系統發展史上的一座里程碑。從技術上看,不斷增加的屏幕解析度,64位處理器,到支持所有平臺開發的HTML5技術逐步成熟,硬體性能的提 ...
  • 來自遠方的“僵屍之手” 最近,安天AVL移動安全和獵豹移動安全實驗室共同截獲病毒“僵屍之手“——一種偽裝成正常應用,並通過遠程指令控制中毒手機,實施惡意行為的病毒。該病毒通常偽裝成正常的工具類應用或娛樂類應用進行傳播(如下圖所示)。“僵屍之手”在用戶未察覺其為病毒的情況下安裝進入用戶手機,成功繞開部 ...
  • 1.tableView隱藏滾動條 2.關於屬性 使用assign: 對基礎數據類型 (NSInteger,CGFloat)和C數據類型(int, float, double, char, 等等) 使用copy: 對NSString 使用copy: 對NSString 使用retain(strong) ...
  • 一,效果圖。 二,代碼。 RootViewController.m ...
  • 1:iOS 使用NJKWebViewProgress做webview進度條 2:解決輸入框UITextField關於拼音或部首被當作內容響應 這裡主要使用了兩個知識: 輸入法輸入時,拼音字母或者筆畫處於選中狀態,可以使用 markedTextRange 獲取到 普通輸入,以及將輸入法的待選字填入輸入 ...
  • 先把字元串轉換成時間NSDate 然後再把時間轉換成我們需要的時間格式的字元串 其中需要註意的是 EEE 和 MMM 所代表的含義 會隨著 NSDateForMatter 的 Locale 屬性的不同 而改變 當Locale 屬性為 ...
  • 最近在使用iOS的可變數組時出現了一個錯誤,報錯信息為: reason: '-[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object' 字面的意思就是可變數組的方法發送給了一個不可變的對象。 聲明和初始 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...