Android工具箱之理解app資源文件

這是一個系列,咱們將其命名爲工具箱,若是你尚未看以前的文章:html

Android工具箱之Context解析android

Android工具箱之文件目錄segmentfault

Android工具箱之組織你的代碼文件app

Android工具箱之Activity生命週期ide

Android工具箱之遷移到AppCompat工具

Android工具箱之Android 6.0權限管理佈局

概要

在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

定義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/

相關文章
相關標籤/搜索