官术网_书友最值得收藏!

2.1 基本資源

04 基本資源

Android中的資源指非Java代碼部分,只要是不與業務流程相關的、用于界面部分的都可以用資源表示。與傳統的程序相比,Android資源的概念非常寬泛:布局、樣式、主題、顏色、字符串、圖形……無不涵括在其中。這樣做的好處就是將程序設計的代碼與外觀設計進行了分離,使得程序的升級、維護、改版等工作變得更加容易,甚至可以交給不同的工作人員來完成。

按照第1章講到的方法配置了Android的開發環境后,通過簡單的項目向導就可以得到一個默認的App。現在想添加一個新信息:“張岸佐”(用戶的名字),將名字顯示為紅色,原有的“Hello,World!”改為“張岸佐,你好!”,位置調整到名字的右側。

2.1.1 資源概述

Android資源是一種XML標記語言。通過采用此種語言的文件,計算機之間可以處理包含各種信息的文章等。采用資源文件的定義形式,有如下好處。

1)簡化操作。Android采用XML文件定義控件,將控件中的各種屬性集成,在程序開發中簡化了源代碼的編寫。

2)實現數據分離。使用代碼實現數據顯示是一件十分麻煩的事,每次數據改變都需要花費大量時間修改代碼。XML的獨立式數據文件存儲的出現,給開發工作省下不少工夫,讓運用重點偏向于布局和顯示。

在AS中開發的每一個Android項目都會有一個res目錄,還可以創建一個assets目錄,這些目錄中的文件用于存儲Android資源。

res目錄下可新建一些固定名字的子文件夾,用于保存各類XML資源。Android提供了一個資源編譯工具,它會按照事先約定的目錄結構,把res目錄下的文件自動編譯,并生成R.java文件,應用程序可以通過R.java對資源文件采用“R.type.name”的方式進行引用,R常用的資源引用類別有R.drawable、R.id、R.layout、R.string、R.attr、R.plural、R.array等。Android支持的資源如表2-1所示。

表2-1 Android支持的資源

assets目錄比較少用,主要用于保存一些數據文件。與res目錄下的XML文件不同,assets文件保存的是一些二進制文件,這些文件并沒有經過編譯,需要通過字節流的方式進行訪問。但是在實際開發軟件的時候,難免會引入一些較大的應用資源,如果圖方便全放到res或assets目錄中,這會導致程序運行緩慢,所以經常也將大文件放到SD卡上進行處理。

除用XML定義資源外,也可以用程序創建資源對象。為了代碼的易組織性和可維護性,僅在特殊時候采用這種方法,否則將使得程序更加難以維護和重用。

2.1.2 布局資源

設計程序界面較方便且可維護的方式是創建XML布局資源。這種方法極大地簡化了UI設計過程,將許多用戶界面組件的布局以及屬性定義都保存在XML中,以代替程序代碼,適應了UI設計師(更關心布局)和開發者(了解Java和實現應用程序功能)潛在的分離工作的需要。同時,開發者依然可以在必要的時候動態地改變屏幕內容。

布局資源定義了在屏幕上顯示的內容。布局資源一般存儲在應用程序的\res\layout資源目錄下的XML文件中。布局資源簡單地說就是一個用于用戶界面屏幕或屏幕一部分以及內容的模板。對每一屏(與某個活動緊密關聯)都創建一個XML布局資源是一種通用的做法,但這并不是必需的。理論上來說,可以創建一個XML布局資源并在不同的活動中使用它,為屏幕提供不同的數據。如果需要,也可以分散定義布局資源,并用另外一個文件包含它們。

下面是一個簡單的XML布局資源,一個LinearLayout中包含一個TextView和一個ImageView,代碼如下。

這個布局資源表示屏幕上包含兩個組件:一個組件顯示一些文字,另一個組件顯示一張圖片。這兩個組件都包含在一個垂直方向的LinearLayout布局中。在模擬器中的顯示效果如圖2-1所示。

圖2-1 布局顯示示例

要在代碼中使用布局資源,只需要在onCreate()方法中調用setContentView(int resid)方法即可。例如布局資源存放在\res\layout\activit_main.xml文件中,程序代碼中使用此布局資源的語句就可以是:setContentView(R.layout.activit_main);如果需要引用其中的TextView對象(ID名為showstring),可以使用R.id.showstring。

AS集成了一個用于設計和預覽布局資源的布局資源設計器。這個工具包括兩個標簽視圖:“Design”視圖為開發者提供預覽在不同的屏幕下以及每一種顯示方式時的界面控件展現模式;“Text”視圖展示資源的XML定義。布局資源設計器如圖2-2所示。

圖2-2 布局資源設計器

在AS中使用布局資源設計器時常用以下操作。

? 在Palette視圖中選擇組件添加到界面中。

? 直接在預覽視圖中增、減組件。

? 在預覽視圖和Component Tree視圖中選擇特定的控件并使用屬性窗格來調整控件的屬性。

? 使用text視圖來直接編輯XML定義。

需要注意的是,布局資源設計器不能完全精確地模擬出布局在最終設備上的展示情況,而且一些特殊的控件(例如標簽或視頻查看器)也不能在此預覽,所以開發者必須在適當配置的模擬器中測試,更重要的是在目標設備上測試。

2.1.3 字符串資源

布局中引入的TextView組件和Button組件上往往需要顯示相應的文字,實現方式有以下兩種。第一種方式是直接修改這些組件的Text屬性為某字符串,第二種方式就是建立字符串資源,然后在Text屬性中關聯這些資源。

初學者更喜歡第一種方式,簡單而且直接,但是當程序比較復雜,面臨維護、升級、改版、修改時,就會出現較大困難。舉一個例子:在開發的應用程序中需要在兩個地方顯示用戶的名字,如果在兩個地方都直接設定控件的Text為“張岸佐”,當需要將此處修改成“張工程師”時,就要在兩處分別修改,而大型程序往往是多人協同開發的,就會出現漏改的風險。更好的方案則是第二種方式,建立一個字符串資源,定義其值為“張岸佐”,需要顯示的兩處地方與此字符串資源的ID相關聯,當需要修改時,只要修改該字符串資源即可,相關引用處會自動更新。

Android允許在一個或多個XML文件中定義一個或多個字符串,這些XML文件位于\res\values目錄下,根元素是<resources></resources>,文件名也可以任意指定,例如如下的strings.xml定義。

文件定義好之后,其中每個字符串的name屬性將由ADT自動在R.java中維護一個ID索引,開發人員可以在Java代碼和XML文件中使用定義的字符串。如果在Java代碼中使用字符串“hello”時,采用getResources().getString(R.string.hello)形式調用;如果需要在其他XML文件中引用這個字符串,使用<TextView android:text="@string/hello">形式調用。

2.1.4 顏色資源

提到顏色,必須弄清楚顏色的編碼,現在比較流行的顏色編碼有RGB、CMYK等,一般前者用于顯示器,后者用于印刷。在Android中,使用RGB顏色編碼。具體來說,RGB顏色編碼有#AARRGGBB、#ARGB、#RRGGBB、#RGB等形式,R、G、B為三原色紅、綠、藍,A表示透明度,即alpha。A、R、G、B的取范圍都是0~255之間的一個十六進制數。R、G、B值越大,顏色越深,如果R、G、B值都為0,表示顏色為黑色,R、G、B值都為255,表示白色。#RGB、#ARGB的區別與#RRGGBB、#AARRGGBB的區別在于前兩者R、G、B的取值范圍是0~F,顏色值跟透明度的8位字節的高4位和低4位相同,想表示更多顏色值,則需要使用后兩者。常見顏色編碼如表2-2所示。

表2-2 常見顏色編碼表

(續)

在不考慮透明度的前提下,用#RRGGBB編碼就可以了,關于調試顏色的更多理論在此不再贅述,請讀者參考其他資料。

顏色資源的XML文件定義在項目的res\values目錄下,根元素是<resources></resources>。如下代碼定義了一個顏色資源文件,分別采用了#AARRGGBB、#ARGB、#RRGGBB、#RGB形式。

在Java代碼中使用這個顏色資源的代碼如下所示。

在其他XML文件中使用顏色資源如下代碼所示。

2.1.5 尺寸資源

Android支持的尺寸資源比較豐富,以適應不同智能手機分辨率的需求,在不同的應用場合下需要選擇不同的尺寸單位,現在將幾種常見尺寸單位的表示方法總結如表2-3所示。

表2-3 常見尺寸單位表示方法表

當屏幕密度(density)為160dpi(點/英寸)時,1dp=1sp=1px,但是如果屏幕大小不變而密度提高,比如提高到320dpi時,原來用px作為單位的元素大小將縮小一半,而如果用dp或sp作為單位,則顯示效果保持不變。

尺寸資源文件位于res\values目錄下,根元素是<resources></resources>標記。在該元素中使用<dimen></dimen>標記定義各尺寸資源,其中,通過為<dimen></dimen>標記設置name屬性來指定尺寸資源的名稱,在起始標記<dimen>和結束標記</dimen>中間定義一個尺寸常量,如下面的代碼定義所示。

在Java代碼中采用Resources.getDimen(R.dimen.dimen_name)的形式調用,在XML文件中采用<TextView android:textSize="@dimen/dimen_name">的形式調用。

2.1.6 樣式和主題資源

樣式資源主要用于對組件的顯示樣式進行控制,XML文件位于res\values目錄下,根元素是<resources></resources>標記。在該元素中使用<style></style>標記定義樣式,其中,通過為<style></style>標記設置name屬性來指定樣式資源的名稱。在起始標記<style>和結束標記</style>中間添加<item></item>標記定義格式項。在一個<style></style>中可以定義多個<item></item>標記。<style></style>還支持樣式繼承,使用parent屬性進行設置即可,如下代碼所示。

當一個樣式繼承另一個樣式后,在子樣式中出現了與父樣式相同的屬性,將使用子樣式中定義的屬性值。Java代碼中不直接使用樣式,樣式僅在XML文件中組件的style屬性上添加引用,XML文件中的引用形式是@[package]style/style_name。同一個項目中,可以省略package,如果要引用Android內部定義的樣式,需要加上命名空間,如@android:style/android_style_name。如下面的代碼定義了一個組件使用樣式。

主題與樣式定義相似,不同的是,主題包含的顯示屬性不能作用于單個View組件,而是對所有(或單個)Activity起作用。通常情況下,主題中的格式都是為改變窗口外觀而設置的。如下的代碼定義了一個主題資源。

此定義中,@符號和問號都代表引用,前者引用的是其他地方定義的資源對象,而問號引用的是“運行時資源對象”。

主題資源定義完成后,就可以使用主題資源了。使用主題資源有以下兩種方式。

1)在Java代碼中引用,常在Activity的onCreate()方法中采用如下的語句形式。

2)在XML文件中引用,需要在AndroidManifest.xml中通過android:theme屬性引用,如果是作用在所有的Activity上,則在<application>的屬性上添加,如果是作用在單個Activity上,在相應<activity>的屬性上添加,下面的代碼為對某個Activity應用主題的語句。

2.1.7 實例1:個性化顯示

1.新建項目,增添組件

在AS中新建項目,應用程序取名“個性化顯示”,項目名稱命名為“ch02_01”,其他取默認值。本項目中將要建立字符串、尺寸和顏色三種資源。這些資源的添加可以使用可視化界面進行操作,也可以使用代碼模式錄入。

(1)建立字符串資源

Android字符串資源被放在res\values下的strings.xml中,雙擊打開,系統已經默認建立了一個字符串資源,app_name用于本應用程序的名字的顯示,其將在模擬器中顯示于圖標的下方。仿照app_name字符串資源,添加其他的字符串,每個字符串用一對<string>標記對表示,字符串的“名字”用name屬性說明,而字符串的“值”則放在標記對之間。最后的代碼如下。

(2)建立顏色資源

顏色資源默認保存在res/values/colors.xml中,如果新建的Android項目中并沒有包含此資源,右擊values,在快捷菜單中選擇“New”→“XML”→“Values XML File”命令,在接下來的向導中輸入文件名“colors.xml”。單擊“Finish”按鈕,可以看到在values下新建了一個colors.xml,目錄結構如圖2-3所示。

建立顏色資源的操作與建立字符串類似,新建一個顏色資源,名字和值分別為“name_color”和“#FF0000”,代碼如下。

圖2-3 新增的colors.xml

(3)建立尺寸資源

可以在res\values下建立demins.xml,將用戶名字的字體大小設置為30sp,代碼如下。

2.布局設置

按照要求,需要顯示兩個左右并排的字符串,用方向設定為“水平”的線性布局非常方便。

Android布局位于res\layout目錄下,默認的布局配置文件為activity_main.xml,雙擊此文件,默認以“Graphical Layout”方式打開該文件,通過單擊下端的“activity_main.xml”標簽,切換到代碼模式查看代碼,代碼如下。

默認的布局為“ConstraintLayout”,可以修改為線性布局:

刪除默認生成的TextView組件,從“Palette”視圖中重新拖入兩個TextView組件,因為布局方式已經設定為水平的線性布局,兩個組件會自動呈現左右排列。

因為此時沒有對TextView的顯示內容進行設定,所以該組件默認顯示的是“TextView”字符串。單擊左側的TextView組件,在右側屬性列表中找到text項,單擊右側的空框按鈕,在如圖2-4所示的對話框中的資源選擇器中選擇“zhang_name”并確定。

圖2-4 選擇一個字符串資源

然后將Text Color屬性值設定為“name_color”顏色資源,這樣“張岸佐”將顯示為紅色,調整它的Text Size屬性為name_size,文本將以30sp的大小顯示。

將右側“textView”下的“text”屬性調整為“hello_world”字符串,顏色與大小同上。最終在模擬器中顯示的界面如圖2-5所示。

圖2-5 模擬器顯示界面

生成的布局文件代碼如下。

3.樣式與主題

如果當前應用中有很多個TextView,需要用統一的方式進行顯示,逐一單獨設置過于煩瑣,而且改版起來也不方便。為了解決類似的問題,Android允許使用樣式和主題對界面中的元素顯示風格進行統一的設置,其區別在于樣式針對某一元素,而主題針對當前的應用程序。

建立一個樣式資源text_view_style,可以控制顯示效果為紅色、30sp,操作方法如下。

雙擊res\values\styles.xml,在原AppTheme樣式后添加自定義樣式,添加兩個Item項,分別控制android:textColor和android:textSize,代碼如下。

上面代碼中AppTheme為創建項目時默認的主題,加粗部分的text_view_style為自定義樣式。最后回到active_main.xml,刪除兩個組件的color、size屬性,將Style屬性調整為“@style/text_view_sytle”,可以看到其顯示效果并未發生改變。

如果將顏色資源name_color設定為#0000FF(藍色),將尺寸資源name_size設定為20sp,運行項目之后,兩個TextView的顯示都按照樣式的要求進行了自動調整,如圖2-6所示。

圖2-6 利用樣式統一調整界面風格

布局文件調整如下。

主站蜘蛛池模板: 丹凤县| 伊吾县| 利川市| 泸州市| 紫金县| 三明市| 张家界市| 徐闻县| 威信县| 于田县| 嵩明县| 光泽县| 大厂| 湘潭县| 南城县| 河西区| 九寨沟县| 宁夏| 安庆市| 博客| 平果县| 台山市| 霸州市| 定南县| 平原县| 沁源县| 治县。| 翁牛特旗| 沽源县| 尼玛县| 察雅县| 达尔| 阿瓦提县| 乾安县| 芮城县| 隆回县| 大厂| 虞城县| 酒泉市| 抚远县| 五寨县|