1. 程式人生 > >Android資源文件手記

Android資源文件手記

top 自定義 色值 根據 set 名稱 大型 gif 菜單

  Android Studio 的res/values文件夾為開發者提供了自定義資源文件的能力。參考Google的文檔,記錄一下。

  一、將資源放入res目錄下指定的子目錄下。res目錄下支持的資源目錄如下:

    animator/ 用於定義屬性動畫的 XML 文件。

    anim/ 定義漸變動畫的 XML 文件。(屬性動畫也可以保存在此目錄中,但是為了區分這兩種類型,屬性動畫首選 animator/ 目錄。)

    color/ 用於定義顏色狀態列表的 XML 文件。

    drawable/位圖文件(.png.9.png.jpg.gif)或編譯為以下可繪制對象資源子類型的 XML 文件:位圖文件;九宮格(可調整大小的位圖);狀態列表;形狀;動畫可繪制對象;其他可繪制對象。

    mipmap/ 適用於不同啟動器圖標密度的可繪制對象文件。

    layout/ 用於定義用戶界面布局的 XML 文件。

    menu/ 用於定義應用菜單(如選項菜單、上下文菜單或子菜單)的 XML 文件。

    raw/要以原始形式保存的任意文件。要使用原始 InputStream 打開這些資源,請使用資源 ID(即 R.raw.filename)調用 Resources.openRawResource()

      但是,如需訪問原始文件名和文件層次結構,則可以考慮將某些資源保存在 assets/ 目錄下(而不是 res/raw/)。assets/ 中的文件沒有資源 ID,因此您只能使用 AssetManager

讀取這些文件。

    values/包含字符串、整型數和顏色等簡單值的 XML 文件。其他 res/ 子目錄中的 XML 資源文件是根據 XML 文件名定義單個資源,而 values/ 目錄中的文件可描述多個資源。對於此目錄中的文件,        <resources> 元素的每個子元素均定義一個資源。例如,<string> 元素創建 R.string 資源,<color> 元素創建 R.color 資源。

    由於每個資源均用其自己的 XML 元素定義,因此您可以根據自己的需要命名文件,並將不同的資源類型放在一個文件中。但是,為了清晰起見,您可能需要將獨特的資源類型放在不同的文件中。 例 如,對於可在此目錄中創建的資源,下面給出了相應的文件名約定:arrays.xml,用於資源數組(類型化數組)。colors.xml:顏色值。dimens.xml:尺寸值。strings.xml:字符串值。styles.xml:樣式。

  解釋一下values文件夾這段話:谷歌的意思是除了values文件下的資源文件都是根據xml文件名來引用的,但是values文件夾下的資源文件則是根據子元素類型來引用的。你可以在values下新建任意名稱的文件,在其中定義自己的資源,最後只需要通過getResource().getString(R.String.xxx)來引用。但是為了整齊劃一,谷歌給我們規範了這幾種資源類型的文件名,但你可以不用,或者另起爐竈建其他文件名,只要在values下的某個文件中的<resources>標簽下定義了你想要的資源標簽和值。例如在values文件夾下建立custom.xml文件,在裏面定義

                  <?xml version="1.0" encoding="utf-8"?>
                  <resources>
                  <bool name="boolean_value">true</bool>
                  <string name="custom_string">這是在values下自定義的字符串</string>
                  <dimen name="custom_text_font">18sp</dimen>
                  </resources>
通過getResources().getDimensionPixelSize(R.dimen.custom_text_font)使用。

    切勿將資源文件直接保存在res目錄下,編譯會報錯。以上是安卓的默認資源。除此之外,對於屏幕尺寸超過標準大小的設備或者設置了不同語言類型的系統,還需要準備不同的布局資源和字符串文本資源。這些稱為備用資源。

  二、備用資源

技術分享圖片

  如上圖所示,不同類型設備或者不同地區的設備需要有多個資源。Android會在運行時檢測設備的配置並加載合適的資源文件。安卓通過一下方式來指定不同的資源文件:

    

  1. res/ 中創建一個以 <resources_name>-<config_qualifier> 形式命名的新目錄。
    • <resources_name> 是相應默認資源的目錄名稱(如一中所定義的資源目錄)。
    • <qualifier> 是指定要使用這些資源的各個配置的名稱(請參閱https://developer.android.com/guide/topics/resources/providing-resources.html)。

    您可以追加多個 <qualifier>。以短劃線將其分隔。

    註意:追加多個限定符時,必須按照表 2 (參閱上方鏈接)中列出的相同順序放置它們。如果限定符的順序錯誤,則該資源將被忽略。

  2. 將相應的備用資源保存在此新目錄下。這些資源文件的名稱必須與默認資源文件完全一樣。

例如:

    res/

      drawable/

        icon.png

        background.png

      drawable-hdpi/

        icon.png

        background.png

    在使用備用資源的配置限定符名稱時,安卓規定了一些規則:

  • 您可以為單組資源指定多個限定符,並使用短劃線分隔。例如,drawable-en-rUS-land 適用於橫排美國英語設備。
  • 這些限定符必須遵循表 2(上方紅色鏈接) 中列出的順序。例如:
    • 錯誤:drawable-hdpi-port/
    • 正確:drawable-port-hdpi/
  • 不能嵌套備用資源目錄。例如,您不能擁有 res/drawable/drawable-en/
  • 值不區分大小寫。在處理之前,資源編譯器會將目錄名稱轉換為小寫,以避免不區分大小寫的文件系統出現問題。 名稱中使用的任何大寫字母只是為了便於認讀。
  • 對於每種限定符類型,僅支持一個值。例如,若要對西班牙語和法語使用相同的可繪制對象文件,則您肯定不能擁有名為 drawable-rES-rFR/ 的目錄,而是需要兩個包含相應文件的資源目錄,如 drawable-rES/drawable-rFR/。然而,實際上您無需將相同的文件都復制到這兩個位置。相反,您可以創建指向資源的別名。實際就是對一個原始資源的多次引用。

將備用資源保存到以這些限定符命名的目錄中之後,Android 會根據當前設備配置在應用中自動應用這些資源。 每次請求資源時,Android 都會檢查備用資源目錄是否包含所請求的資源文件,然後查找最佳匹配資源(下文進行介紹)。 如果沒有與特定設備配置匹配的備用資源,則 Android 會使用相應的默認資源(一組用於不含配置限定符的特定資源類型的資源)。

    要使應用支持多種設備配置,則務必為應用使用的每種資源類型提供默認資源,這一點非常重要,否則可能會出現應用在部分地區語言或者設備上崩潰。關於Android如何查找最佳匹配資源可參見鏈接。大致如下:第一步,淘汰含有與系統設置沖突的限定符的資源文件。第二步,選擇列表(表 2)中(下一個)優先級最高的限定符。(先從 MCC 開始,然後下移。)第三步,是否有資源目錄包括此限定符?若無,請返回到第 2 步,看看下一個限定符。(在該示例中,除非達到語言限定符,否則答案始終為“否”。)若有,請繼續執行第 4 步。第四步,淘汰不含此限定符的資源目錄。在該示例中,系統會淘汰所有不含語言限定符的目錄。如果涉及的限定符是屏幕像素密度,則 Android 會選擇最接近設備屏幕密度的選項。通常,Android 傾向於縮小大型原始圖像,而不是放大小型原始圖像。請參閱支持多種屏幕

第五步,返回並重復第 2 步、第 3 步和第 4 步,直到只剩下一個目錄為止。在此示例中,屏幕方向是下一個判斷是否匹配的限定符。因此,未指定屏幕方向的資源被淘汰:

drawable-en/
drawable-en-port/
drawable-en-notouch-12key/

剩下的目錄是 drawable-en-port

盡管對所請求的每個資源均執行此程序,但是系統仍會對某些方面做進一步優化。 例如,系統一旦知道設備配置,即會淘汰可能永遠無法匹配的備用資源。 比如說,如果配置語言是英語(“en”),則系統絕不會將語言限定符設置為非英語的任何資源目錄包含在選中的資源池中(不過,仍會將不帶語言限定符的資源目錄包含在該池中)。

  根據屏幕尺寸限定符選擇資源時,如果沒有更好的匹配資源,則系統將使用專為小於當前屏幕的屏幕而設計的資源(例如,如有必要,大尺寸屏幕將使用標準尺寸的屏幕資源)。 但是,如果唯一可用的資源大於當前屏幕,則系統不會使用這些資源,並且如果沒有其他資源與設備配置匹配,應用將會崩潰(例如,如果所有布局資源均用 xlarge 限定符標記,但設備是標準尺寸的屏幕)。

:限定符的優先順序(表 2 中)比與設備完全匹配的限定符數量更加重要。例如,在上面的第 4 步中,列表剩下的最後選項包括三個與設備完全匹配的限定符(方向、觸摸屏類型和輸入法),而 drawable-en 只有一個匹配參數(語言)。但是,語言的優先順序高於其他兩個限定符,因此 drawable-port-notouch-12key 被淘汰。

Android資源文件手記