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

下载并打印备忘表,方便参考。

优点

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

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.

已知限制

  1. 屏幕需要有唯一的名称

    为了避免参数中的冲突 <WHERE>,View(比如 activity 或 fragment)必须有唯一的名称。因此,您不能拥有 MainActivityMainFragment,因为 Main 前缀将不再唯一标识一个 <WHERE>

  2. 不支持重构

    更改类名称不会随资源名称而变化,所以如果你将 MainActivity 重命名为 ContentActivity,那么布局 activity_main 将不被自动被重命名为 activity_content。希望 Android Studio 有一天会为此添加支持。

  3. 并非所有资源类型都支持

    该方案目前尚不支持所有资源类型。对于某些资源来说,这是因为它们的使用频率较低,往往是非常多样化的(例如 rawassets),对于其他资源,这是因为它们难以泛化(例如,主题/样式/颜色/动画)。

原文地址:《A successful XML naming convention》