Android 开发之 XML 文件的命名规范

你还记得最后一次不得不钻进 strings.xml 为了找到正确的字符串来使用吗?或者你会手动去在所有的 drawables 中寻找那个你需要的吗?
每当我们开始一个新项目时,我们都会非常关心建立我们的架构,CI,构建风格,但是你有一个策略来命名您的资源吗?
你应该有!由于缺乏 XML 命名空间,使得管理 Android Resources 变得乏味。并且使事情变得容易失控,特别是在大型项目中。
所以我们来介绍一个简单的方案来解决你的痛苦。
- 轻松查找任何资源(自动完成)
- 合逻辑的,可预测的名称
- 干净的资源排序
- 强类型的资源
这篇博客将解释其机制、优点、局限性,并提供易于使用的备忘表。
基本原则
所有资源名称遵循简单的规则
我们先简要介绍一下每个元素。然后我们将看到如何应用于每种资源类型。
<WHAT>
指示资源实际代表什么,通常是标准的Android视图类,例如 MainActivity -> activity_ 。
<WHERE>
描述它在逻辑上属于应用程序。多个屏幕中使用的资源使用 all,所有其他用户使用他们所在的Android视图子类的自定义部分,例如 MainActivity -> activity_main,ArticleDetailFragment -> fragment_articledetail 。
<DESCRIPTION>
区分一个屏幕中的多个元素,例如 title_ 。
<SIZE>(可选)
一个精确的大小或对大小的描述,用于 drawablem 和 dimension,例如 _24dp 或 _small 。

下载并打印备忘表,方便参考。
优点
- 通过屏幕资源的排序。
WHERE部分描述了筛选资源所属。因此,很容易获取特定屏幕的所有ID。 - 强类型的资源ID。
对于资源 ID,WHAT描述了它所属的 xml 元素的类名。这使得您的findViewById()变得容易使用。 - 更好的资源组织。
文件浏览器/项目导航器通常按字母顺序排序文件。这意味着 layouts 和 drawables 可以按它们的WHAT(activity 或 fragment 等) 和WHERE前缀分组排序。一个简单的 Android Studio 插件/特性可以将这些资源显示在它们自己的文件夹中。 - 更高效的自动填充。
由于资源名称更加可预测,因此使用 IDE 的自动完成变得更加容易。通常输入WHAT或WHERE足以将自动完成缩小到有限的一组选项。 - 没有更多的名称冲突。
不同屏幕中的类似资源是all或者有不同的WHERE。固定的命名方案避免了所有的命名冲突。 - 干净的资源名称。
总体而言,所有资源的命名将更加合乎逻辑,从而导致一个更干净的 Android 项目。 - 工具支持。
这个命名方案可以很容易地被 Android Studio 支持,其功能包括:lint 规则强制执行这些名称,重构支持,当您更改WHAT或WHERE更好的资源可视化在项目视图……
Layouts
布局相对简单,因为每个屏幕通常只有几个布局。因此,规则可以简化为:

<WHAT> 是下面其中之一:
| Prefix | Usage |
|---|---|
| activity | contenview for activity |
| fragment | view for a fragment |
| view | inflated by a custom view |
| item | layout used in list/recycler/gridview |
| layout | layout reused using the include tag |
示例:
- activity_main: content view of the MainActivity.
- fragment_articledetail: view for the ArticleDetailFragment.
- view_menu: layout inflated by custom view class MenuView.
- item_article: list item in ArticleRecyclerView.
- layout_actionbar_backbutton: layout for an actionbar with a backbutton (too simple to be a customview).
Strings
对于字符串来说不需要 <WHAT> 前缀,因此直接用 <WHERE> 作为前缀。

如果字符串会在多个页面被用到,使用 all_ 作为前缀。

示例:
- articledetail_title: title of ArticleDetailFragment.
- feedback_explanation: feedback explanation in FeedbackFragment.
- feedback_namehint: hint of name field in FeedbackFragment.
- all_done: generic “done” string.
<WHERE> 对于同一视图中的所有资源显然是一样的。
Drawables
同样<WHAT>对于 drawables 也是没有必要的,所以我们用 <WHERE> 来表示 drawable 的位置:

会被复用的 drawable 同样以 all_ 作为前缀:

或者,您可以添加一个参数,它可以是实际大小 _24dp 或大小限定符 _small。
示例:
- 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 元素的类名,比如 tablayout、imageview 等等,<WHERE> 是 xml 文件所在屏幕的名称。
示例:
- tablayout_main -> TabLayout in MainActivity.
- imageview_menu_profile -> profile image in custom MenuView.
- textview_articledetail_title -> title TextView in ArticleDetailFragment.
Dimensions
应当只定义有限的 dimension,并尽量复用它们,你应该主要使用:

并可选择使用屏幕特定的变体:

<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>s,其他 dimensions 限定符,如旋转,刻度等通常仅用于可绘制,因此较少重复使用。
示例:
- height_toolbar: height of all toolbars.
- keyline_listtext: listitem text is aligned at this keyline.
- textsize_medium: medium size of all text.
- size_menu_icon: size of icons in menu.
- height_menu_profileimage: height of profile image in menu.
已知限制
屏幕需要有唯一的名称。
为了避免参数中的冲突
<WHERE>,View(比如 activity 或 fragment)必须有唯一的名称。因此,您不能拥有MainActivity和MainFragment,因为Main前缀将不再唯一标识一个<WHERE>。不支持重构。
更改类名称不会随资源名称而变化,所以如果你将
MainActivity重命名为ContentActivity,那么布局activity_main将不被自动被重命名为activity_content。希望 Android Studio 有一天会为此添加支持。并非所有资源类型都支持。
该方案目前尚不支持所有资源类型。对于某些资源来说,这是因为它们的使用频率较低,往往是非常多样化的(例如
raw和assets),对于其他资源,这是因为它们难以泛化(例如,主题/样式/颜色/动画)。