天天看點

Android學習筆記(三九):資源resource(下)

在上一次學習筆記中,學習了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開發相關文章