Android命名规范

89
我正在寻找一个详细的Android命名约定建议。 我在这里找到一点:

http://source.android.com/source/code-style.html#follow-field-naming-conventions

其中说:

  • 非公共,非静态字段名以m开头。
  • 静态字段名以s开头。
  • 其他字段以小写字母开头。
  • 公共静态常量字段使用ALL_CAPS_WITH_UNDERSCORES格式。

但我正在寻找更详尽的涵盖Android所有方面的内容:

  • 如何命名布局和其中的视图,
  • 如何命名菜单
  • 如何命名样式
  • 如何命名数据库表(单数,复数)和其中的字段
  • 等等

如果有一些普遍接受的建议,我会很高兴遵循它。 所有SDK似乎都走自己的路线,所以我特别关注Android的做法。


2
由于这是在Google上的第一个搜索结果,我想我应该补充一下:通过在Android-Studio和Eclipse中使用“重构”,您可以重命名某个东西并更改所有出现的地方。这对我很有用,因为我很挑剔命名规范;这也是我搜索的原因。重命名特定实例非常容易,然后就可以继续工作了。 - Eric Anthony
忽略Google的编码风格,它没有解释得足够清楚,也不是一个完整的对话。因为每个公司/团队都有自己的编码习惯,所以并没有任何国际编码规范。请使用您自己的编码风格。 - Yousha Aleayoub
7个回答

98

ribot的Android指南是标准命名约定的良好示例:

XML文件的命名约定:

activity_<ACTIVITY NAME>.xml - for all activities
dialog_<DIALOG NAME>.xml - for all custom dialogs
row_<LIST_NAME>.xml - for custom row for listview
fragment_<FRAGMENT_NAME>.xml - for all fragments

XML文件中组件/小部件的命名规范:

X活动中的所有组件必须以活动名称开头,所有组件应该有前缀或简称,如btn代表Button

例如,登录活动组件的名称应如下所示。

activity_login_btn_login
activity_login_et_username
activity_login_et_password

主要组件的简称:

Button - btn
EditText - et
TextView - tv
ProgressBar - pb
Checkbox - chk
RadioButton - rb
ToggleButton - tb
Spinner - spn
Menu - mnu
ListView - lv
GalleryView - gv
LinearLayout -ll
RelativeLayout - rl

8
不太重要,只要你(或你们公司)采用一个风格,不管它来自哪里。到目前为止,我已经制作了大约4个简单的Android应用程序,并为自己设计了几乎与这个应用程序完全相同的约定。我认为这就是你所需要的全部。我使用“a_”代替“activity”等,因为那太长了,哈哈。 - Srneczek
在组件的命名中,是否真的有必要以活动的名称开头?我的意思是无论如何,您都会在相应的布局文件中引用这些名称。 - szedjani
2
这并不是必须的,但当你的项目逐渐壮大时,这将非常有帮助。 - Pravin Bhosale
5
MainActivity + activity_main 是标准命名方式,但谁发明了这个呢?特别不直观,尤其是当片段(fragment)出现时名称变得更长了。 - brainray
就个人而言,我认为这并不是很一致。 - Jethro
似乎https://github.com/NexMM/android-naming-conventions/blob/master/README.md是来源。 - RominaV

38

这是一个非常好的最佳实践集合,适用于编程相关内容:

https://github.com/futurice/android-best-practices

以下是我使用的内容。 我也将从该链接中复制。

对象命名

  • 按照Google的指南,不要使用ms前缀。我已经停用多年,发现没有它们更容易。IDE会在您使用私有或静态内容时告诉您;这似乎是一种过时的约定。
  • 常量以大写字母开头
  • 首字母缩略词只应大写第一个字母。例如,functionUrlunitId。不是unitID
  • 以对象类型为前缀。例如包含名称的TextView将是tvName。带有密码的EditView将是etPass
  • 如果它通常只在活动中使用一次(例如ListView),不要害怕直接称其为lv
  • 如果它不是对象类型,请按其功能命名。例如,如果是保存ID的字符串,请将其命名为id,而不是stringId。IDE会告诉您它是字符串、浮点数还是长整型。
  • 保持易读性。使用Pass代替Password之类的内容。
  • 在XML中,名称应该用下划线而不是大写字母,例如tv_nameet_pass
  • android:id放在XML的第一个属性中。

文件命名

  • 将布局文件以类型为前缀进行命名。例如:fragment_contact_details.xmlview_primary_button.xmlactivity_main.xml
  • 对于类,将它们分类到文件夹中,但使用后缀。例如:/activities/MainActivity.java/fragments/DeleteDialog.java。我的文件夹包括activities、fragments、adapters、modelsutils
  • 适配器应说明它们的用途和使用方式。因此,聊天活动的ListView适配器可能被称为ChatListAdapter

colors.xml和dimens.xml作为调色板

  • 对于颜色,请使用名称如gray_light,而不是button_foreground

  • 对于尺寸,请使用名称如spacing_large,而不是button_upper_padding

  • 如果您想为按钮颜色或填充设置特定值,请使用样式文件。

strings.xml

  • 使用类似命名空间的键来命名字符串,并且不要害怕为两个或多个键重复使用值。

  • 使用error.message.network而不是network_error

原因

命名约定的目的不是使一切整齐一致。它的存在是为了标记可能的错误并改进工作流程。大部分都是为方便键盘快捷方式而设计的。尝试集中精力减少错误和提高工作流程,而不是追求美观。

前缀非常适合那些“那个TextView叫什么名字?”的时刻。

后缀用于那些你不经常以那种方式访问的东西,但可能会引起困惑。例如,我可能不确定我将代码放在该页面的Activity、Fragment还是Adapter中。如果您愿意,可以删除它们。

XML id通常是小写的,并使用下划线,只是因为似乎每个人都这样做。


类名应该怎么取呢?例如:ActivityMainMainActivity。你会推荐哪一个?我认为按照以下方式命名比较合理:类名:NameActivity,布局文件名:name_activity,组件名:nameactivity_component_name。例如:MainActivity,main_activity,mainactivity_btn_cancel。 - Jethro
4
我使用了m和s前缀。我发现这非常有用,而且肯定不会使代码变得更糟。此外,有时候我更喜欢在没有集成开发环境的情况下打开一些文件。很容易区分字段和简单变量。 - Arkadiusz Cieśliński
我目前正在查看Camera2示例,我真的不在意mBackgroundHandler等名称的来源,因此将它们命名为backgroundHandler可以将重要信息放在左侧。如果需要,可以在参数后添加下划线后缀和在本地变量后添加双下划线后缀,这样可以在不需要关注它们时视觉上和心理上跳过下划线,除非你需要专注于它们。 - WillC

17

一致性
每个人(除非在团队中工作)都会有自己的约定,选择哪一个并不重要。确保整个应用程序 一致 是重要的。


结构
个人而言,我使用这样的命名约定,因为它从类名到组件一直保持一致:

  • <ClassName>
  • 活动<ClassName>**Activity**
  • 布局classname_activity
  • 组件IDclassname_activity_component_name

例如: OrderActivity.classorder_activity.xmlorder_activity_bn_cancel。请注意,所有XML都是小写。


缩写布局
如果您想要使用更短的名称以使代码更整洁,则另一种方法是将XML中所有名称缩写为布局。

例如: OrderActivity.class:ord_act.xml、ord_act_bt_can、ord_act_ti_nam、ord_act_tv_nam。我将名称分为三个部分,但这取决于您有多少相似的名称。


缩写组件类型
在缩写组件类型时,请尽量保持一致。我通常使用两个字母表示组件类型,三个字母表示名称。但是,如果该名称是布局中该类型的唯一元素,则可能不需要名称。 ID的原则是唯一的。

  • 组件IDnam_act_component_nam

组件类型缩写(本列表显示两个字母即可)
Frame Layout: fl
Linear Layout: ll
Table Layout: tl
Table Row: tr
Grid Layout: gl
Relative Layout: rl

Text View: tv
Button: bt
Check Box: cb
Switch: sw
Toggle Button: tb
Image Button: ib
Image View: iv
Progress Bar: pb
Seek Bar: sb
Rating Bar: rb
Spinner: sp
WebView: wv
Edit Text: et

Radio Group: rg
List View: lv
Grid View: gv
Expandable List View: el
Scroll View: sv
Horizontal Scroll View: hs
Search View:* se
Tab Host: th
Video View: vv
Dialer Filter: df

Include: ic
Fragment: fr
Custom View (other): cv


4
不是的,"radio button" 翻译成中文是 "单选按钮",而 "rating bar" 翻译成中文是 "评分条"。两者虽然都是用户界面上的组件,但在功能和形式上有所不同。 - Mitch

9
我认为目前还没有针对此的惯例。每家公司都有自己的规则,我认为在这里没有人会过于关心这个。
对于我来说,我更喜欢将名称绑定到上下文中。例如,如果有一个名为“MainActivity”的活动,则其布局名称将是“main_activity.xml”,并且对于与该活动相关联的每个资源,我都会添加一个前缀“main_activity”,以便我知道它使用了它。对于此活动使用的ID也是如此。
我使用这些命名的原因是更容易找到它们,需要时删除它们,而且如果您使用Android库,则不会与其他人替换它们,因为这些名称非常独特。
我还尽可能地给出有意义的名称,因此您通常看不到像“listView”或“imageView2”这样的ID,而是类似于“contactsListView”和“contactImageView”。相同的名称(或类似)也将与Java代码中的变量匹配,以使其更容易找到。
所以,总之,我的建议是:
- 尽量避免名称中使用数字。它们通常意义不大,并表明您只使用了拖放UI设计器。 - 对于演示、POC和在这里提问,不要过于担心命名。 - 尝试为所有资源(包括ID)的名称添加前缀,以显示它们所属的上下文,并实现唯一性。 - 尽可能提供有意义的名称。

2
最新的Android Eclipse插件在创建新项目时会自动创建您提到的某些文件。从那里开始,命名类似于:
layout/activity_main.xml
menu/activity_main.xml
...

我使用以下方案,例如:

layout/fragment_a.xml
layout/fragment_b.xml
...

因此,它就像包名称一样,从一般到详细。它还允许整洁的排序。


1
关于命名约定和/或最佳实践,我通常遵循在Github上的ribot/android-guidelines存储库中列出的项目和编码指南,其中包括this md file。请注意保留HTML标签。

0

每个人都使用自己的命名规则,主要目标是避免错误和误解,特别是在他人阅读你的代码时。尽管现代IDE中的语法高亮和自动代码检查使其显得有些无意义。

但是这些命名约定在打开代码完成功能时也非常方便。例如,只需键入m,自动完成将显示一个类字段列表。

但很多时候,你必须使用其他人编写的代码,而这些代码并没有使用这样的约定。这些受保护的变量和重写的方法参数只会增加混淆。

以下是一些示例:

  • 将类变量前缀设为 m,将静态常量变量全部大写,并用 _ 分隔单词。不要给较低范围的变量添加任何前缀。

  • 根据 UI 父级命名布局,例如 act_main.xmlfrg_detail.xmlitm__act_main__list1.xml;分别用于活动 MainActivity、片段 DetailFragmentMainActivity 中 ID 为 list1ListView 的项目布局。

  • 在 XML 布局中,将元素 ID 命名为 lsv__act_main__list1(用于 ListView)和 btn__act_main__submit(用于按钮元素)。这样可以更轻松地使用自动完成找到它们。


谢谢 - 对我来说,编码规范在强大的IDE时代并不是毫无意义的,这只是我的看法,所以我希望能找到一些更普遍接受的规范。 - dorjeduck
没问题。它们还有其他好处:您可以在LogCat中看到UI视图的ID,并从ID知道它是什么,以及在代码中查找它的位置。 - S.D.
我会为前缀使用完整限定名:activit_main.xmlfragment_main.xmlbutton_activity_main_submit.xml 等。 - Ramón García-Pérez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接