Andoird開發一種富有成效的資源文件命名規則
你還記得最后一次在strings.xml中尋找要用的字符串嗎?還記得自己最后一次不得不瀏覽完所有的drawable才找到想要的那個圖標嗎?
每當開始一個新的項目,我們總是化太多心思到配置和架構上,但是對于資源文件的命名,你有自己的一套對策嗎?
其實你應該有才對!因為如果缺乏xml的命名規則會讓安卓資源文件的管理混亂,尤其是在大項目中。
那么就讓我們來介紹一個可以減輕你痛苦的簡單方案吧。
這篇博客將闡述其機制、好處、限制,并提供一個可隨時查閱的清單。
基本準則
所有的資源文件名稱都遵循一個簡單的約定。
我們首先簡明的描述一下每個元素。然后列舉這樣做的好處,之后我們將演示如何把它應用到各種類型的資源文件中。
<WHAT>
表示到底代表的是什么資源,通常是一個標準的安卓View類,或者能代表view的類。(e.g. MainActivity -> activity)
<WHERE>
表示它屬于app的什么地方。在多個頁面使用的資源用all,其它的使用它們所在頁面名稱的自定義部分(e.g. MainActivity -> main, ArticleDetailFragment -> articledetail)。
<DESCRIPTION>
區分同一界面的不同元素
(e.g. title)
<SIZE> (可選)
可以是準確的大小也可以是描述大小的文字。可以選擇性的用在drawable和dimension上。
(e.g. 24dp, small))
可以下載和打印我提供的 備忘清單 方便隨時查閱。
好處
-
按頁面組織資源
WHERE部分描述了一個資源所屬的頁面。因此可以很容易識別出一個特定頁面的所有ID, drawable, dimension。
-
一眼就能從資源ID判斷出類型
對于資源id,WHAT部分描述了這個id所屬的xml元素的類名。這樣可以讓你更容易知道findViewById()調用之后應該轉換成什么類。
-
Better resource organizing
File browsers/project navigator通常按照字母順序排列文件。這意味著布局和drawable是按照他們的 WHAT(activity, fragment,..) 和 WHERE前綴組織的。現在有一個簡單的Android Studio插件可以讓這些資源看起來就像在自己的文件夾里面一樣。
-
提高自動補全的效率
因為資源名稱非常好預測,使得ide的自動補全更容易了。通常輸入WHAT或者 WHERE就足以把自動補全的提示縮小到很窄的范圍了。
-
不再有命名沖突
不同頁面之間相似的資源具有不同的where,或者是使用all。
-
更清晰的命名
總體來說資源文件的命名更加有邏輯,使得項目更清晰。
-
Tools support
This naming scheme could be easily supported by the Android Studio offering features such as: lint rules to enforce these names, refactoring support when you change a WHAT or WHERE, better resource visualisation in project view,...
LAYOUTS
布局的命名相對簡單,因為通常一個頁面只有很少的布局。因此規則可以簡化成:
其中<WHAT>可以是以下名稱之一:
前綴 | 用處 |
---|---|
activity | activity的布局 |
fragment | fragment的布局 |
view | 一個自定義view所要inflated的布局 |
item | recycler或者gridview中使用的布局 |
layout | include標簽中用來重用的布局 |
例子:
-
activity_main: MainActivity的布局
-
fragment_articledetail: ArticleDetailFragment的布局
-
view_menu: 被自定義view:MenuView所inflate的布局
-
item_article: ArticleRecyclerView中的item
-
layout_actionbar_backbutton:帶有返回按鈕的actionbar的布局
STRINGS
Strings的<WHAT>部分無關緊要。所以你要么使用<WHERE>表明string被使用的地方:
要么使用all表示整個app都要使用這個string:
Examples:
-
articledetail_title: ArticleDetailFragment的標題
-
feedback_explanation: FeedbackFragment中的feedback explanation
-
feedback_namehint: hint of name field in FeedbackFragment
-
all_done: 通用的 "done" 字符。
很明顯同一視圖下的資源<WHERE>都是一樣的。
DRAWABLES
Drawables的<WHAT>也不重要。所以要么使用<WHERE>表明drawable被使用的地方:
要么使用all表示整個app都要使用這個drawable:
還可以選擇性的添加<SIZE>元素,可以是準確的大小如“24dp”也可以是大小修飾詞如“small”。
Examples:
-
articledetail_placeholder: placeholder in ArticleDetailFragment
-
all_infoicon: generic info icon
-
all_infoicon_large: large version of generic info icon
-
all_infoicon_24dp: 24dp version of generic info icon
IDS
對于ID,<WHAT>指的是它所屬的xml元素的類名。然后是id所在的頁面,最后可以選擇性的跟上一個描述,以區別同一頁面的相似元素。
例子:
-
tablayout_main -> MainActivity中的TabLayout
-
imageview_menu_profile -> 自定義MenuView中的profile image
-
textview_articledetail_title ->ArticleDetailFragment中標題對應的TextView
DIMENSIONS
app應該只定義一套數量有限的常用dimension,這個特性使得dimension一般都默認用all。
因此你最常用的是:
偶爾也可以指定具體的頁面:
其中<WHAT>是以下名稱之一:
Prefix | Usage |
---|---|
width | width in dp |
height | height in dp |
size | if width == height |
margin | margin in dp |
padding | padding in dp |
elevation | elevation in dp |
keyline | absolute keyline measured from view edge in dp |
textsize | size of text in sp |
注意這里只包含了最常用的<WHAT>。其它dimension描述如:rotation, scale,...通常只用在drawable上,而且也是很少用。
例子:
-
height_toolbar: toolbar的高度
-
keyline_listtext: listitem text所要對齊的keyline
-
textsize_medium: 所有文字的中等大小
-
size_menu_icon: 菜單中圖標的大小
-
height_menu_profileimage: 菜單中profile image的高度
已知的缺陷
-
頁面必須具有唯一的名稱
了避免<WHERE>參數發生沖突,View(以及可以代表View)的類必須具有獨有的名稱。所以你不能同時有“MainActivity”和 "MainFragment",因為 "Main" 前綴不再能夠識別出一個<WHERE>了。ps:這點其實可以靈活的處理,一般這種情況發生在不需要what的情況下,其實這個時候where我們可以用activity_main來表示,而不是main。
-
不支持重命名
修改類的名稱并不能同步修改資源名稱。所以如果你把 "MainActivity" 改為 "ContentActivity",布局"activity_main"并不會重命名為"activity_content"。希望哪天Android Studio能添加這種支持。ps:這不算是缺陷吧,又不是這種命名規則引起的。
-
不能支持所有的資源類型
這種規則當前不支持所有的資源類型。主要是有些資源不常用(比如raw 和 assets),還有些資源不是很好歸納(比如:themes/styles/colors/animations)。
WRAP-UP
以上就是本文的內容。一個簡單易用的資源文件命名規則。別忘了下載 cheat sheet 方便查閱哦!
雖然這種規則并不覆蓋所有的資源類型,但是它的確提供了一種解決了絕大多數命名問題的方法。
來自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/1104/6745.html