嗨大家今天過得好嗎?今天想來聊聊專案中除了 business logic 外另一個也很重要的資料夾是 res/ ,用來管理專案中的媒體資源例如 App launcher 的 icon、動畫、畫面、顏色。針對不同類型的資源底下又分成不同資料夾,分別以資源種類劃分或是同一種類底下又細分不同資源,例如先前介紹過的 dark mode 就是把同樣的 color id 對應到不同的色碼分別放在 values-night
和 values
的資料夾底下。
命名順序是先寫比較大的共同項目到比較小的差異項目,例如法語在法國和加拿大的用法就分成兩種,應該命名成「fr-rFR」和「fr-rCA」先寫共同的語言 ( fr ) 再寫地區是法國 ( region Franch ) 和加拿大 ( region Canada )。如果能用資料夾區別兩種資源,就可以使用一樣的檔名但引入不同資源,提高專案管理的效率。
每個 res id 被建立後都是一個獨立的常數,可以被其他的 res 使用。例如可以在 layout.xml 的檔案中在 android:text
的屬性設定對應到 string id 的值,或是在 style.xml 的 colorPrimary 設定 color id 的值。在同一個檔案也可以使用前面創建好的 res id,例如 color 中可以這麼使用:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="red">#f00</color>
<color name="highlight">@color/red</color>
</resources>
除了前面提到直接在屬性中使用對應的 res id,也可以動態在 MainActivity 的 business logic 裡面存取需要的 res id,部分 View 的 api 只要提供 res id 的 Int 就可以使用,例如 ImageView.setImageResource 只要 id 就好,但大部分還是需要拿到實際的 res,這時候就需要透過 Context.getResource() 的 api 拿到實際的 res,例如 TextView.setText 要傳入 resource.getString(R.string.toolbar) 就是拿到實際的 string 而不是只有 id 的 int。使用的 resource 就跟提供什麼 Context 有關,例如你 App 有設定多國語系,當前 Activity 顯示的語言是中文,但你的 Application 使用的是系統預設的 Context,而系統語言是英文,如果調用的 Context 不一致,大部分調用到 Activity 但少部分調用到 Application 的就會有語系不一致的問題。
專案中有些通用或是很重要的 resource 可以在 attr.xml 的檔案裡聲明這項屬性的名稱和格式,之後在 style.xml 的主題中指定對應的 value,要調用時由於已經在 attr 的檔案中聲明屬性的格式系統只要去查 attr 的檔案就好,可以寫成 ?android:attr/textColorSecondary
、 ?android:textColorSecondary
或是直接寫 ?textColorSecondary
就好。
res 簡介到這邊,再來會介紹 localization 和一些特別的 res 用法,對今天分享的內容有興趣的邦友請繼續關注「打造一個厲害的普通 Android App - 使用者體驗優化」的主題,我們明天見。