包名全部采用小写,不用下划线区分单词
主包名采用[公司性质].[公司名称].[项目名称]的命名方式
- 例如:翡翠教育做的手机助手包名edu.feicui.assistant
通用功能子包名采用[主包名].[通用名称]的命名方式
Android中常见命名规则
包名
包名全部小写,连续的单词只是简单地连接起来,不使用下划线。
采用反域名命名规则,全部使用小写字母。一级包名为com,二级包名为xx(可以是公司或则个人的随便),三级包名根据应用进行命名,四级包名为模块名或层级名。
包名 | 此包中包含 |
---|---|
com.xx.应用名称缩写.main | 页面用到的Activity类 (activitie层级名用户界面层) |
com.xx.应用名称缩写.activity | 页面用到的Activity类 (activitie层级名用户界面层) |
com.xx.应用名称缩写.base | 基础共享的类 |
com.xx.应用名称缩写.adapter | 页面用到的Adapter类 (适配器的类) |
com.xx.应用名称缩写.util | 此包中包含:公共工具方法类(util模块名) |
com.xx.应用名称缩写.bean | 下面可分:vo、po、dto 此包中包含:JavaBean类 |
com.xx.应用名称缩写.model | 此包中包含:模型类 |
com.xx.应用名称缩写.db | 数据库操作类 |
com.xx.应用名称缩写.view(或者 com.xx.应用名称缩写.widget ) | 自定义的View类等 |
com.xx.应用名称缩写.service | Service服务 |
com.xx.应用名称缩写.receiver | BroadcastReceiver服务 |
com.xx.应用名称缩写.prwd | 首选项 |
com.xx.应用名称缩写.provider | 内容提供者 |
类名
类名都以UpperCamelCase风格编写。
类名通常是名词或名词短语,接口名称有时可能是形容词或形容词短语。现在还没有特定的规则或行之有效的约定来命名注解类型。
名词,采用大驼峰命名法,尽量避免缩写,除非该缩写是众所周知的, 比如HTML,URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写。
类 | 描述 | 例如 |
---|---|---|
Activity 类 | Activity为后缀标识 | 欢迎页面类WelcomeActivity |
Adapter类 | Adapter 为后缀标识 | 新闻详情适配器 NewDetailAdapter |
解析类 | Parser为后缀标识 | 首页解析类HomePosterParser |
工具方法类 | Util或Manager为后缀标识(与系统或第三方的Utils区分)或功能+Util | 线程池管理类:ThreadPoolManager日志工具类:LogUtil(Logger也可)打印工具类:PrinterUtil |
数据库类 | 以DBHelper后缀标识 | 新闻数据库:NewDBHelper |
Service类 | 以Service为后缀标识 | 时间服务TimeServiceBroadcast |
Receiver类 | 以Receiver为后缀标识 | 推送接收JPushReceiver |
ContentProvider | 以Provider为后缀标识 | 1 |
自定义的共享基础类 | 以Base开头 | BaseActivity,BaseFragment |
方法名
方法名都以 LowerCamelCase 风格编写。
方法名通常是动词或动词短语。
方法 | 说明 |
---|---|
initXX() | 初始化相关方法,使用init为前缀标识,如初始化布局initView() |
isXX() checkXX() | 方法返回值为boolean型的请使用is或check为前缀标识 |
getXX() | 返回某个值的方法,使用get为前缀标识 |
handleXX() | 对数据进行处理的方法,尽量使用handle为前缀标识 |
displayXX()/showXX() | 弹出提示框和提示信息,使用display/show为前缀标识 |
saveXX() | 与保存数据相关的,使用save为前缀标识 |
resetXX() | 对数据重组的,使用reset前缀标识 |
clearXX() | 清除数据相关的 |
removeXXX() | 清除数据相关的 |
drawXXX() | 绘制数据或效果相关的,使用draw前缀标识 |
量词列表 | 量词后缀说明 |
---|---|
First | 一组变量中的第一个 |
Last | 一组变量中的最后一个 |
Next | 一组变量中的下一个变量 |
Prev | 一组变量中的上一个 |
Cur | 一组变量中的当前变量。 |
资源文件命名规范
资源布局文件(XML文件(layout布局文件)):
全部小写,采用下划线命名法
contentview 命名
必须以全部单词小写,单词间以下划线分割,使用名词或名词词组。
所有Activity或Fragment的contentView必须与其类名对应,对应规则为:
将所有字母都转为小写,将类型和功能调换(也就是后缀变前缀)。
名称 | 描述 | 命名 |
---|---|---|
Dialog | dialog_描述.xml | dialog_hint.xml |
PopupWindow | ppw_描述.xml | ppw_info.xml |
列表项 | item_描述.xml | item_city.xml |
包含项 | 模块_(位置)描述.xml | activity_main_head.xml、activity_main_bottom.xml |
UI控件缩写表
控件 | 缩写 | 例子 |
---|---|---|
LinearLayout | ll | llFriend或者mFriendLL |
RelativeLayout | rl | rlMessage或mMessageRL |
FrameLayout | fl | flCart或mCartFL |
TableLayout | tl | tlTab或mTabTL |
Button | btn | btnHome或mHomeBtn |
ImageButton | ibtn | btnPlay或mPlayIBtn |
TextView | tv | tvName或mNameTV |
EditText | et | etName或mNameET |
ListView | lv | lvCart或mCartLV |
ImageView | iv | ivHead或mHeadIV |
GridView | gv | gvPhoto或mPhotoGV |
资源文件(图片drawable文件夹下):
全部小写,采用下划线命名法,加前缀区分
命名模式:可加后缀 small 表示小图, big 表示大图,逻辑名称可由多个单词加下划线组成,采用以下规则:
用途模块名逻辑名称
用途模块名颜色
用途逻辑名称
用途颜色
说明:用途也指控件类型(具体见UI控件缩写表)
名称 | 命名 |
---|---|
btn_main_home.png | 按键 |
divider_maket_white.png | 分割线 |
ic_edit.png | 图标 |
bg_main.png | 背景 |
btn_red.png | 红色按键 |
btn_red_big.png | 红色大按键 |
ic_head_small.png | 小头像 |
bg_input.png | 输入框背景 |
divider_white.png | 白色分割线 |
如果有多种形态如按钮等除外如 btn_xx.xml(selector)
功能 | 命名 |
---|---|
按钮图片使用btn_正常情况效果 | btn_xx_normal |
按钮图片使用btn_点击时候效果 | btn_xx_pressed |
state_focused聚焦效果 | btn_xx_focused |
state_enabled (false)不可用效果 | btn_xx_disabled |
state_checked选中效果 | btn_xx_checked |
state_selected选中效果 | btn_xx_selected |
state_hovered悬停效果 | btn_xx_hovered |
state_checkable可选效果 | btn_xx_checkable |
state_activated激活的 | btn_xx_activated |
state_window_focused | btn_xx_windowfocused |
背景图片使用bg_功能_说明 | bg_head |
默认图片使用def_功能_说明 | def_search_cell |
图标图片使用ic_功能_说明 | ic_more_help |
具有分隔特征的图片使用seg_功能_说明 | seg_list_line |
选择图标使用sel_功能_说明 | sel_ok |
常见的英文单词缩写:
名称 | 缩写 |
---|---|
icon | ic (主要用在app的图标) |
color | cl(主要用于颜色值) |
divider | di(主要用于分隔线,不仅包括Listview中的divider,还包括普通布局中的线) |
selector | sl(主要用于某一view多种状态,不仅包括Listview中的selector,还包括按钮的selector) |
average | avg |
background | bg(主要用于布局和子布局的背景) |
buffer | buf |
control | ctrl |
delete | del |
document | doc |
error | err |
escape | esc |
increment | inc |
infomation | info |
initial | init |
image | img |
length | len |
library | lib |
message | msg |
password | pwd |
position | pos |
server | srv |
string | str |
temp | tmp |
window | wnd(win) |
一般功能子包名采用[主包名].[模块名称].[子模块名称]的命名方式。
- 例如:手机助手的闹钟模块包名 edu.feicui.assistant.alarm
只需导入用到的类,不得用*导入包下所有类
导入类时,系统类在上方,自定义类在下方
1 代码主要采用大/小驼峰命名法,即除首字母外,每个单词首字母大写,整体首字母大小根据其它规范决定
2 类名、接口名、枚举名等首字母大写,若由多个单词组成,则其后每个单词首字母大写,例如:
class ConfigManager{}
3 类名、接口名、枚举名等首字母大写,若由多个单词组成,则其后每个单词首字母大写,例如:
class ConfigManager{}
4 继承自安卓组件的类,采用父类名作为后缀,例如:
class LoginActivity extends Activity{}
5 自定义异常必须以Exception结尾
6 除for循环变量外,一律不得使用i、j、k等单字符作为变量名
7 定义数组时方括号紧随在原始类型之后,数组名称一般使用复数形式,
- 例如:int[] arrays;
8 常量、枚举等均采用大写形式,用下划线区分各单词,
- 例如:final static int DIALOG_ID_ALARM = 1;
enum Season{SPRING, SUMMER, AUTUMN, WINTER};
9 全局变量添加所有者前缀:实例成员变量前缀m(表示member),类静态变量前缀s(表示static),
- 例如:实例变量mRun
类静态变量sInstance
10 控件变量添加组件前缀,顺序在所有者前缀之后,
- 例如:全局名称mBtnNext
局部名称btnNext
常见控件前缀如下表:
11 除单例模式外一般不得使用静态变量
12 常量一般使用final static修饰,根据需要使用可见性修饰符,例如:
public static final int VISIBLE = 0x00000000;
13 一般方法名首字母小写,若由多个单词组成,则其后每个单词首字母大写
14 构造方法采用递增方式(参数多的写在后面)
- 例如:
public GameView(Context context) {
this(context, null);
}
public GameView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public GameView(Context context, AttributeSet attrs, int defStyle) {}
15 仅在项目内使用的实体类不使用JavaBean进行封装,直接将成员变量访问修饰符修改为非private,例如:
class User{public String name,pwd;}
16 实体类中固定值的成员变量可设置成final,并通过构造函数初始化
17 实体类中不得随意修改的成员变量可添加下划线前缀以作区别,例如:
class User{public int _id;}
18 一般不使用System.out输出,而是使用Log中的方法
19 使用BuildConfig.DEBUG标记对Log进行封装,只在调试时输出重要信息,正式版不输出
20 一般try……catch只捕获需要的异常,catch块不得为空,至少应当将异常信息输出
21 资源命名全部采用小写,各单词间以下划线区分
22 布局文件采用[前缀]_[功能模块].xml的命名方式,
- 例如:
MainActivity的布局activity_main.xml]
常见前缀如下表:
23 图片采用[性质前缀][功能模块] [属性后缀].[扩展名]的方式,
- 例如:
主背景图片bg_main.png
确定按钮按下btn_ok_presssed.png
常见属性后缀如下表:
values目录下文件名称较固定,不得随意更改,常见名称如下:
1开源项目必须添加文件注释,非开源项目建议添加,例如:
/*
* @(#): Document.java
* @project:IndentObjectNatation
* @version: v1.1
* @copyright: Copyright (C) 2013-2014 The Emerald Education
* @description:
* This file is a part of Indent Object Notation project.
*
* @modify:
* ---- No.1 Modified By Mr. Tang At 2014-05-06 11:32 Based On 1.0 ----
* Create this file.
* ---- No.2 Modified By Mr. Zhang At 2014-05-06 11:32 Based On 1.0 ----
* Make the class Document extend from the class Node.
*/
2类定义一般需要写类注释,接口一般需要写接口注释,如果没有文件注释,则需要在类注释和接口注释中标出作者,例如:
/**
* Root of the ION tree, provides the access to the document's data.
*
* Subclass of {@link Node}, Since elements, comments, etc. cannot exist
* outside the context of a Document, the Document also contains the
* factory methods needed to create these objects.
*
*
* @author Mr. Zhang
*/
class Document {}
3成员变量、静态变量、常量等添加属性注释,例如:
/** This view is invisible. */
public static final int INVISIBLE = 0x00000004;
4关联性较大的多个成员变量等可以共用同一条注释,例如:
/** The width and height of View. */
private int mWidth, mHeight;
5public和protected方法必须添加方法注释,default和private方法建议添加方法注释,例如:
/**
* Writes {@code count} characters starting at {@code offset} in {@code buf}
* to the target.
*
* @param buf
* the non-null character array to write.
* @param offset
* the index of the first character in {@code buf} to write.
* @param count
* the maximum number of characters to write.
* @return {@code true} if success, otherwise {@code false}
* @throws IndexOutOfBoundsException
* if {@code offset < 0} or {@code count < 0}, or if {@code
* offset + count} is greater than the size of {@code buf}.
* @throws IOException
* if this writer is closed or another I/O error occurs.
*/
public abstract boolean write(char[] buf, int offset, int count) throws IndexOutOfBoundsException, IOException;
6若覆盖基类的方法,则可以不写方法注释,但必须用@Override标出,例如:
@Override
protected void onCreate(Bundle savedInstanceState) {}
7不建议继续使用的方法用@Deprecated标出
8switch……case的每个条件一般添加简短说明,例如:
switch (type) {
case 1:// Android apps
break;
case 2:// Android games
break;
case 3:// iOS apps
break;
default:// Not a valid package
break;
}
9 如果if的条件大于2个,则必须写注释,例如:
if (isBluetooth // If Bluetooth network is on
|| isWifi // If WLAN network is on
|| is3g // if 3g network is on
) {}
10 对于未完成的方法,使用TODO加以标记,例如:
void write(byte[] buf, File file) {
// TODO: Write buf to file
}
11 若功能已完成,但存在效率等潜在问题时,使用XXX加以标记,例如:
void parseXML(File file) {
// XXX: Maybe SAX is better
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(file);
}
12 若代码存在严重问题或仅用于调试,使用FIXME加以标记(注:存在FIXME标记的代码不能作为正式版发布)
boolean login(String name, String pwd) {
//FIXME: Remove this line before publishing
System.out.println("name=" + name + ", password=" + pwd);
if (users.containsKey(name) && users.get(name).equals(pwd))
return true;
return false;
}
13 如果for、while等代码块过长,可以在结尾处标记循环变量,例如:
for (int position = 0; position < 10; position++) {
……
}// end for: position
while(mRun){
……
}// end while: mRun