這是一個系列,咱們將其命名爲工具箱,若是你尚未看以前的文章:html
Android工具箱之Context解析android
Android工具箱之文件目錄segmentfault
在Android開發中,幾乎全部的事情就是資源,而定義資源是你在開發Android應用時,最重要的一環。動畫
資源被用在不少地方,例如定義顏色,字符串,圖片,佈局,菜單等,這樣定義的好處就是再也不進行硬編碼。全部的東西都須要定義在你的資源文件中,而後其被app中的Java代碼所引用。最簡單且最經常使用的資源是Strings資源。ui
下列是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。
對於你的應用的每一個文本(好比按鈕的文本,或者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/