Android命名约定

我正在寻找一个彻底的Android命名约定的build议。 我在这里find了一点点:

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

其中说:

  • 非公开的非静态字段名称以m开头。
  • 静态字段名称以s开头。
  • 其他字段以小写字母开头。
  • 公共静态最终字段(常量)是ALL_CAPS_WITH_UNDERSCORES。

然而,我正在寻找涵盖Android各个方面的更广泛的东西:

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

如果有一些普遍接受的build议,我只想跟随。 所有的SDK似乎都是自己的方式,所以我特别感兴趣的Android的方式来做到这一点。

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 for Button 。例如,login活动组件的名称应如下所示。

 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 

这是一个很好的收集最好的做法开始: https : //github.com/futurice/android-best-practices

这是我使用的。 我也将从该链接复制。

对象命名

  • 不要按照Google指南使用ms前缀。 我已经停了好几年了,没有他们我觉得更容易。 IDE会告诉你什么时候使用私有或静态的东西; 这似乎是一个过时的惯例。
  • CONSTANTS以大写字母开头
  • 首字母缩略词只能大写首字母。 例如, functionUrlunitId 。 不是unitID
  • 前缀与对象的types。 例如,包含名称的TextView将是tvName 。 带有密码的EditView将是etPass
  • 如果它通常只在活动中使用过一次(比如ListView),不要害怕把它叫做lv
  • 如果它不是一个对象types,只是通过它的函数来命名。 例如,如果它是一个包含ID的string,则将其命名为id ,而不是stringId。 IDE会告诉你它是一个string还是一个浮点数或一个long。
  • 保持清晰。 使用Pass而不是Password
  • 在XML中,名称应该用下划线表示,例如tv_nameet_pass
  • android:id作为XML中的第一个属性。

文件命名

  • 前缀与它的types的布局。 例如, fragment_contact_details.xmlview_primary_button.xmlactivity_main.xml
  • 对于类,将它们分类到文件夹中,但使用后缀。 例如/activities/MainActivity.java/fragments/DeleteDialog.java 。 我的文件夹是活动,片段,适配器,模型实用程序
  • 适配器应该说如何和何时使用它们。 所以ChatActivity的ListView适配器可能被称为ChatListAdapter

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

  • 对于颜色,请使用像gray_light这样的gray_light ,而不是button_foreground

  • 对于维度,请使用像spacing_large这样的spacing_large ,而不是button_upper_padding

  • 如果你想设置特定的button颜色或填充的东西,使用一个样式文件。

strings.xml中

  • 用类似于命名空间的键命名你的string,不要害怕重复两个或更多键的值。

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

推理

命名约定的目的不是要使所有的东西都整洁一致 。 它在那里标记可能的错误并改善工作stream程。 其中大部分devise为方便键盘快捷方式。 尝试着重于最大限度地减less错误并改善工作stream程,而不是看起来不错。

前缀非常适合那些“那个TextView的名称是什么? 时刻。

后缀是在那些你不经常以这种方式访问​​的东西,但可能会造成混乱。 例如,我可能不确定是否将我的代码放在该页面的Activity,Fragment或Adapter中。 如果你喜欢,他们可以放弃。

XML标识通常是小写字母,并且使用下划线,因为每个人似乎都这样做。

我不认为这是一个公约。 每个公司都有自己的规则,我不认为这里有人关心它。

对我而言,我更喜欢把名字绑定到上下文中。 例如,如果存在名为“MainActivity”的活动,则其布局名称将是“main_activity.xml”,对于与此活动关联的每个资源,我都会添加一个前缀“main_activity”,以便我知道它使用它。 用于此活动的ID也一样。

我使用这些命名的原因是它更容易find它们,如果需要删除,并且如果使用android库,则不会将其replace为其他名称,因为这些名称非常独特。

我也尝试尽可能地给出有意义的名称,所以你通常不会看到“listView”或“imageView2”作为ID,但像“contactsListView”和“contactImageView”。 相同的名称(或类似名称)也会匹配java代码中的variables,以便更容易find。

所以,总之,我的提示是:

  • 尽量避免名字内的数字。 他们通常没有太多的意义,并表明你只是使用拖放的UIdevise师。

  • 对于演示,POC和在这里的问题,不要担心自己的命名。

  • 尝试为资源的所有名称(包括ID)添加前缀以显示它们属于哪个上下文,并实现唯一性。

  • 尽可能给出有意义的名字。

一致性
每个人(除非在团队中工作)将有自己的惯例,你select哪一个并不重要。 确保整个应用程序的一致性是重要的。

结构体
就我个人而言,我使用这样的命名约定,因为它从类名向下运行到组件,并在整个xml中保持一致:

  • CLASSClassNameNameActivity
  • 布局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。 我把名字分成三个,但这取决于你有多less类似的名字

缩减组件types
当缩写组件types时也尽量保持这些一致。 我通常使用两个字母的组件types和三个字母的名称。 但是,如果这是布局中该types的唯一元素,则有时不需要该名称。 身份证的原则是独一无二的

  • 组件 nam_act_component_namnam_act_component_nam

组件types缩写 (该列表显示两个字母,大量)
帧布局: fl | 线性布局: ll | 表格布局: tl | 表格行: tr | 网格布局: gl | 相对布局: rl

文本视图: tv | button: bt | checkbox: cb | 开关: sw | 切换button: tb | 图像button: ib | 图像查看: iv | 进度条: pb | 寻求酒吧: sb | 评分栏: rb | Spinner: sp | WebView: wv | 编辑文本: et

广播组: rg | 列表视图: lv | 网格视图: gv | 可扩展列表视图: el | 滚动查看: sv | 水平滚动视图: hs | search查看: se | 标签主机: th | video视图: vv | 拨号filter: df

包括: ic | 片段: fr | 自定义视图(其他): cv

每个人都用自己的,主要目标是避免错误和曲解,特别是当别人读你的代码时。 尽pipe在现代IDE中使用语法高亮显示和自动代码检查,但却使其显得不那么重要。

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

但是很多时候你必须使用其他代码,而不使用这种约定。 这样的保护variables和重写的方法参数只是添加到混淆。

几个例子:

  • 使用m前缀类variables,并使用_分隔单词将静态最终variables全部大写。 不要前缀任何东西来降低范围variables。

  • UI父级之后的名称布局,例如act_main.xmlfrg_detail.xmlitm__act_main__list1.xml ; 对于活动MainActivity ,一个片段DetailFragment ,一个ListView项目布局,分别在ID为list1 MainActivity进行。

  • 名称元素Id的xml布局,如:ListView的btn__act_main__submit和Button元素的btn__act_main__submit 。 这使得他们更容易find自动完成。

最新的Android Eclipse插件会创build一些您在创build新项目时自动提及的文件。 从这个angular度来看,命名是这样的:

 layout/activity_main.xml menu/activity_main.xml ... 

我遵循这个计划与例如

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

所以就像包名一样,从一般到详细。 它也允许整齐sorting。