Android工具箱之理解app資源文件
這是一個系列,我們將其命名為工具箱,如果你還沒有看之前的文章:
概要
在Android開發中,幾乎所有的事情就是資源,而定義資源是你在開發Android應用時,最重要的一環。
資源被用在很多地方,例如定義顏色,字符串,圖片,布局,菜單等,這樣定義的好處就是不再進行硬編碼。所有的東西都需要定義在你的資源文件中,然后其被app中的Java代碼所引用。最簡單且最常用的資源是Strings資源。
資源的分類
下列是Android中常用的資源:
-
Property動畫 文件夾:animator 詳情:xml文件定義Property動畫
-
Tween動畫 文件夾:anim 詳情:xml文件定義Tween動畫
-
Drawables 文件夾:drawable 詳情:bitmap文件或者xml文件
-
Layout 文件夾:layout 詳情:用來定義用戶界面的xml文件
-
Menu 文件夾:menu 詳情:用來定義action bar或者菜單
-
Values 文件夾:values 詳情:用來定義strings或者dimens等的xml
完整的,你可以參照 Providing a Resource guide 。
定義String資源
對于你的應用的每個文本(比如按鈕的文本,或者textview的文本等),你應該首先在res/values/strings.xml文件中定義你的文本。每一個文本都是一對鍵值對,舉個例子,如果你想讓你的按鈕展示Submit文本,那么你需要在strings.xml文件中:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello!</string> <string name="submit_label">Submit</string> </resources>
現在如果我引用了資源文件submit_label,其對應的值Submit就會展現。最后,你可以創建多個資源文件針對不同的國家和地區,或者不同的設備。
引用資源
現在我們定義了我們自己的字符串資源,我們可以隨時隨地的訪問它,不論在Java代碼或者布局文件中。例如,在布局文件中,我們簡單的使用@來引用它。
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/submit_label" />
在你的Java代碼中訪問資源文件,你需要使用getResources.getString方法或者getString方法來通過其資源id獲取其對應的值。
String submitText = getResources().getString(R.string.submit_label);
相同的方法也適用于圖片或者顏色的獲取, getResources()方法返回資源對象,該對象可以獲取所有的資源,而每個資源對應一個單獨的文件夾。
動態獲取資源
在一些例子中,你可能想動態的獲取資源。舉個栗子:
public String getStringValue(String key) { // Retrieve the resource id String packageName = getBaseContext().getPackageName(); Resources resources = getBaseContext().getResources(); int stringId = resources.getIdentifier(key, "string", packageName); if (stringId == 0) { return null; } // Return the string value based on the res id return resources.getString(stringId); }
現在你可以直接獲取資源啦:
public String myKey = "submit_label"; // Maps to R.string.submit_label public String myStringValue = getStringValue(myKey); // Returns string text
同樣的id也可這么做:
// getViewById("tvTest"); public View getViewById(String id) { // Retrieve the resource id String packageName = getBaseContext().getPackageName(); Resources resources = getBaseContext().getResources(); int viewId = resources.getIdentifier(id, "id", packageName); if (viewId == 0) { return null; } // Return the string value based on the res id return findViewById(viewId); }
提供可選擇的資源
多樣的設計
為了構建杰出的UI設計,Android開發者需要能夠讓自己的app更加廣泛的使用在不同的設備上。要這么做,我們首先需要安裝屏幕大小區分,app必須為不同的屏幕設置不同的資源文件。
可選擇的資源
資源的強大之處在于其可選擇性,基于屏幕大小,分辨率,語言等,通常的資源選擇有:
-
針對手機和平板的不同布局文件。
-
針對不同語言的string資源。
-
針對不同屏幕分辨率的drawable資源。
-
針對不同平臺版本的style資源。
-
針對不同屏幕方向的布局文件。
針對不同的選擇不同的資源文件,我們需要為其創建不同的文件夾,舉個栗子,當涉及多個屏幕的時候,我們提供多個圖片,那么對應的文件夾應該是res/drawable-hdpi, res/drawable-xhdpi,和res/drawable-xxhdpi,系統會根據手機的分辨率自動選擇使用哪一張圖片,對應的文件樹:
res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png
理解修飾符
Android提供了多個修飾符,你可以針對一個文件夾添加多個修飾符。通常情況下:
語言區分:
-
語言區分:en, fr 語言選擇
-
屏幕大小:sw480dp,sw600dp 屏幕的最小高度或者寬度
-
屏幕方向:port, land 屏幕處于豎直或者橫屏狀態
-
屏幕分辨率:hdpi, xhdpi 屏幕分辨率用于選擇不同圖片
-
平臺版本號:v7, v11, v21 平臺版本通常用于styles
drawable-en-sw600dp-land 用于英語平板橫屏模式。
可選擇的布局文件
通常可選擇的資源被用來針對不同設備,而布局文件也可有修飾符。舉個栗子:
res/ layout/ activity_main.xml item_photo.xml layout-sw600dp/ activity_main.xml layout-sw600dp-land/ activity_main.xml layout-sw720dp/ activity_main.xml item_photo.xml
通常來講,手機在sw240和sw480之間。7寸平板為sw600,10寸為sw720。
布局最佳實踐
下列為如何確保你的app能夠在不同屏幕上展現良好:
-
避免硬編碼在你的代碼里。
-
盡量使用RelativeLayout和不要使用AbsoluteLayout。
-
使用wrap_content和match_parent或者dp。
-
在需要的適合提供可選擇的布局和圖片
參考
http://developer.android.com/guide/topics/resources/string-resource.html
http://developer.android.com/guide/topics/resources/accessing-resources.html
http://mobile.tutsplus.com/tutorials/android/android-string/
http://developer.android.com/guide/topics/resources/providing-resources.html
http://developer.android.com/training/multiscreen/screendensities.html
http://www.evoketechnologies.com/blog/effective-ui-design-tips-android-devices/