iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0

嗨大家今天過得好嗎?今天想來聊聊專案中除了 business logic 外另一個也很重要的資料夾是 res/ ,用來管理專案中的媒體資源例如 App launcher 的 icon、動畫、畫面、顏色。針對不同類型的資源底下又分成不同資料夾,分別以資源種類劃分或是同一種類底下又細分不同資源,例如先前介紹過的 dark mode 就是把同樣的 color id 對應到不同的色碼分別放在 values-nightvalues 的資料夾底下。

命名規則:由大到小

命名順序是先寫比較大的共同項目到比較小的差異項目,例如法語在法國和加拿大的用法就分成兩種,應該命名成「fr-rFR」和「fr-rCA」先寫共同的語言 ( fr ) 再寫地區是法國 ( region Franch ) 和加拿大 ( region Canada )。如果能用資料夾區別兩種資源,就可以使用一樣的檔名但引入不同資源,提高專案管理的效率。

每個 id 都是常數

每個 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

專案中有些通用或是很重要的 resource 可以在 attr.xml 的檔案裡聲明這項屬性的名稱和格式,之後在 style.xml 的主題中指定對應的 value,要調用時由於已經在 attr 的檔案中聲明屬性的格式系統只要去查 attr 的檔案就好,可以寫成 ?android:attr/textColorSecondary?android:textColorSecondary 或是直接寫 ?textColorSecondary 就好。

res 簡介到這邊,再來會介紹 localization 和一些特別的 res 用法,對今天分享的內容有興趣的邦友請繼續關注「打造一個厲害的普通 Android App - 使用者體驗優化」的主題,我們明天見。


上一篇
ViewPager (2):ViewPager2
下一篇
使用 res 的正確姿勢 (2):多語系
系列文
打造一個厲害的普通 Android App - 使用者體驗優化16
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言