Android支持多種設備的方法及資源文件的使用
為不同的設備提供不同的資源,主要是利用特殊命名的資源文件夾來實現的。
在運行時,Android系統根據當前的設備設置自動尋找合適的資源。
默認資源(Default Resources)
編寫應用的時候,需要創建一組默認的資源和一些可選針對特定配置的資源。
默認資源是很重要的。
這些情況下會使用默認資源:
當應用處在特定配置下,而程序並沒有提供這個配置下的相應資源,會使用默認資源;
新的Android版本增加的資源文件修飾符,舊版本不支持該特性,會使用默認資源;
即便處在特定配置下,而相應資源在該配置下替代資源中沒有查找到時,也會使用默認資源。
這里只有一個例外:如果應用程序的minSdkVersion設置為4或者是更高,就可以只提供帶有屏幕密度限定符(ldpi、mdpi、hdpi、xhdpi、nodpi、tvdpi)的替代資源,不用設置默認的drawable資源,Andorid系統會自動尋找相應最好的匹配,並且對位圖進行縮放。
如果默認資源缺失,編譯器並不會報錯,但是當運行時找不到時,用戶會看到錯誤信息和一個強制關閉的按鈕。
Important: Make sure that your application includes a full set of default resources.
默認資源是一個完備的集合,程序中用到的每一個資源都應該定義了一個默認的資源。
而一個本地化的資源可以是不完備的,只包含一個子集,當某些資源缺失時,會轉而讀取默認資源中的相應資源。
測試默認資源時可以把裝置設置到一個應用並不支持的設置狀態下。
比如測試字符串資源,應用程序支持英文和中文(提供了相應的資源),默認是英文。但是把裝置語言設置成日文,此時應該顯示默認資源(英文),如果默認資源缺失,就會出現強制關閉的按鈕。
res/目錄下一般包含了所有的資源目錄,其中默認資源目錄如下:
MyProject/
res/
animator/
anim/
color/
drawable/
layout/
menu/
raw/
values/
xml/
其中values/中常用的文件命名規范:
arrays.xml for resource arrays (typed arrays).
colors.xml for color values
dimens.xml for dimension values.
strings.xml for string values.
styles.xml for styles.
替代資源(Alternative Resources)
Android系統在運行時根據設備格局自動檢測並選擇資源載入,針對特定的格局提供替代資源時,在res/目錄下增加相應的目錄(資源目錄不能嵌套)。
該文件夾需要遵循一定的命名規則:<resources_name>-<config_qualifier>。
resources_name為相應的默認資源目錄名。
config_qualifier為限定符,指定特定的格局或配置,多個限定符可用短划線隔開。多個限定符時要注意一定的連接順序,否則資源會直接被忽略。
在http://developer.android.com/guide/topics/resources/providing-resources.html
中有一個表Table 2,多個限定符連接時必須要保持它們在表中的先后順序。
注意:命名是不區分大小寫的。
相應的資源存儲在新的目錄下,資源的名字必須和它們在默認目錄下的對應資源一致。
查詢設備狀態
String locale = context.getResources().getConfiguration().locale.getDisplayName();
別名資源(Alias Resources)
有的時候兩種特殊配置下可能想用同一種資源,這時候除了將資源復制兩份放在不同的目錄下之外,采用別名的機制處理更好。
這種方式不是對所有資源都適用,這種特性只適用於圖像、布局、字符串和其他簡單值的資源(Drawable、Layout、Strings and other simple values)。
具體方法見:
http://developer.android.com/guide/topics/resources/providing-resources.html
本文不再詳述。
發現最匹配資源的策略
附上圖一張:
支持不同的語言
http://developer.android.com/training/basics/supporting-devices/languages.html
支持不同的語言主要是利用不同的目錄下的字符文件,比如:
res/values/strings.xml 包含默認語言的字符串。
res/values-fr/strings.xml 包含法文的字符串。
res/values-ja/strings.xml 包含日文的字符串。
資源的名字對應好,那么根據不同的本地設置就會自動選擇相應的語言。
語言的限定符(Qualifier Values)有兩種:
第一種是語言編碼:
ISO 639-1:http://www.loc.gov/standards/iso639-2/php/code_list.php
語言編碼由兩個字母構成。
第二種是區域編碼:
ISO 3166-1-alpha-2:
區域編碼也由兩個小寫字母構成,但是前面要加上一個小寫的r。
區域編碼是一個可選項,也可以只使用語言編碼。
例子:
en
fr
en-rUS
fr-rFR
fr-Rca
創建資源文件的時候可以在Eclipse左邊導航窗口右鍵單擊,選擇new->Others->Android XML File。
選擇好對應項目和資源類型(Values)之后,輸入文件名strings.xml,然后點擊Next,就可以自己選擇限定符和填寫值了,完成之后目錄就自動創建了。
比較常用的目錄:
values-zh-rCN簡體中文
values-zh-rTW繁體中文
支持不同的屏幕
http://developer.android.com/training/basics/supporting-devices/screens.html
http://developer.android.com/training/multiscreen/index.html
Android利用尺寸(size)和密度(density)對屏幕進行分類。
尺寸有四種:small, normal, large, xlarge。
密度(分辨率)也有四種:low (ldpi), medium (mdpi), high (hdpi), extra high (xhdpi)。
另外屏幕的方向(screens orientation)也是需要考慮的一個方面:landscape為橫向,portrait為縱向。
設置不同的布局
根據不同的屏幕尺寸可以安排不同的布局。
采用加上限定符的布局文件目錄即可,如:
MyProject/
res/
layout/ # default (portrait)
main.xml
layout-land/ # landscape
main.xml
layout-large/ # large (portrait)
main.xml
layout-large-land/ # large landscape
main.xml
使用不同的位圖
密度(density)是指單位英寸的像素值,也即屏幕的分辨率。根據分辨率的不同提供不同的界面元素圖片。
目錄資源可以設置如下:
MyProject/
res/
drawable-xhdpi/
awesomeimage.png
drawable-hdpi/
awesomeimage.png
drawable-mdpi/
awesomeimage.png
drawable-ldpi/
awesomeimage.png
用的時候@drawable/awesomeimage引用,系統會根據屏幕密度選擇合適的圖片版本。
圖像資源的生成,采用矢量圖,利用如下比例:
xhdpi: 2.0
hdpi: 1.5
mdpi: 1.0 (baseline)
ldpi: 0.75
參考資料
支持不同的設備:
http://developer.android.com/training/basics/supporting-devices/index.html
本地化:
http://developer.android.com/guide/topics/resources/localization.html
提供資源:
http://developer.android.com/guide/topics/resources/providing-resources.html
資源類型:
http://developer.android.com/guide/topics/resources/available-resources.html
語言:
http://developer.android.com/training/basics/supporting-devices/languages.html
不同的屏幕:
http://developer.android.com/training/basics/supporting-devices/screens.html
http://developer.android.com/training/multiscreen/index.html