在上一次學習筆記中,學習了XML檔案的解析,實際上一些簡單的activity屬性,一些簡單的資訊,我們也可以放入xml檔案中,可以直接放入res/vaules,由系統來進行解析,而無須使用XmlPullParser來自己分析。
Dimension
用于字型大小,間距pading等等。常用的尺寸大小詳細見Android 學習筆記(十四):Activity-AutoCompleteTextView,一般我們使用dip/dp和sp,因為和in(inch),mm,以及px(像素點)不同,它和實體螢幕尺寸大小,像素密度無關。
在res/values下面增加一個xml檔案,名字無所謂:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="thin">10px</dimen>
<dimen name="fat">36sp</dimen>
</resources>
如果我們在layout檔案中調用:<TextView .... android:textSize="@dimen/fat" />;如果我們在java源代碼中調用:line1.setTextSize(getResources().getDimension(R.dimen.thin));
Color
同樣顔色也可以在resource檔案中設定,顔色的格式為#RGB,#ARGB,#RRGGBB,#AARRGGBB,采用16進制方式。同樣在res/values下任一個xml檔案,寫法如下:
<resources>
<color name="yellow_orange">#FF5555</color>
<color name="forest_green">#005500</color>
</resources>
如果我們在layout檔案中調用:<TextView ... android:textColor="@color/forest_green" />;如果我們在java源代碼中調用:line1.setTextColor(getResources().getColor(R.color.yellow_orange));
Array
以前在ListActivity中已經有類似的用法,同樣可以在res/values的xml下面設定數組。方式如下:
<resources>
<string-array name="cities">
<item>Philadelphia</item>
<item>Pittsburgh</item>
<item>Allentown/Bethlehem</item>
<item>Erie</item>
</string-array>
</resources>
在Java源代碼中,可以通過String[] cities = getResources().getStringArray(R.array.cities);來擷取。一個常用的方式是設定List的item,例如setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,cities));
不同情況的處理
對于應用,我們需要為不同對象設定不同處理情況,例如國際語言版本,本地語言版本,此外由于Android的裝置種類繁多,要考慮到螢幕的方向(橫屏、豎屏,支援還是不支援螢幕旋轉),螢幕大小和分辨率,是否支援觸摸屏,是否有鍵盤(數字的還是QWERTY),有某其他的輸入裝置(例如D-Pad,就是方向鍵,在feature phone中很常見)。Android處理則這些情況是通過多個資源目錄,目錄名稱有規定,表示适配不同的情況。
對不同語言的适配處理:放置在res/values/strings.xml中為預設的strings,特定的語言,例如英語、西班牙語,分别對應res/values-en/strings.xml和res/values-es/strings.xml。Android系統會根據系統的語言選擇去自動進行适配,如果沒有特定的語言,則采用預設目錄。values-xx中的xx是ISO 639-1中所定義,中文是“zh”,具體可以在維基百科中查。
語言的處理是比較簡單的,但是在裝置的選擇上就比較複雜,因為組合很多。Android對檔案夾的命名有規則,例如螢幕方向在是否觸摸屏之前,觸摸屏在螢幕尺寸之前,例如res/layout-large-port-notouch-qwerty ,res/layout-large-port-stylus-nokeys,res/layout-normal-land-finger-qwerty 等等,這裡的port是portrait,和land(landscape)對應。但是如果我們要為每種可能的排列主要進行處理,幾乎不太可能,我們看看Android選取檔案的一些原則:
一、Android會将不适配的檔案作為候選,例如有一個res/layout-large-port,而目前裝置是普通尺寸,即不适配與-large,是以這個檔案夾将作為候選,如果我們找不到相應的檔案,才會在這裡選擇。記得我們在處理圖檔資源的時候,我們見過某個PNG的圖檔放置在res/drawable-hdpi,而沒有放置在res/drawable-mdpi,普通尺寸是會先查詢-mdpi,如果沒有,再查詢其他,是以如果你隻放置一個圖檔資源,放置在哪個檔案夾都是可以調用的。
二、選擇具有最多比對項,例如有res/layout-large-port-finger-nokeys,和res/layout-port,都比對,則前者的比對數目多,則前者優先。
三、如果比對數目相同,例如res/layout-large-finger-nokeys和res/layout-large-port-nokeys,他們的比對數目相同,這是按前後的優先級别,因為port是放置在finger的前面,是以-port具有更高的優先級别。
根據這些原則,我們并不需要真的将所有的可能進行組合,隻需将相關的給出就可以了。
相關連結: 我的Android開發相關文章