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
),对于其他资源,这是因为它们难以泛化(例如,主题/样式/颜色/动画)。