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

jopen 8年前發布 | 10K 次閱讀 安卓開發 Android開發 移動開發

這是一個系列,我們將其命名為工具箱,如果你還沒有看之前的文章:

Android工具箱之Context解析

Android工具箱之文件目錄

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

概要

在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://segmentfault.com/a/1190000004303900

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!