1、AS规范
- 尽量使用统一的IDE进行开发;
- 编码格式统一为UTF-8;
- 编辑完.java、 .xml等文件后一定要格式化(基本格式方面使用 AS 默认模板即可);
- 删除多余的import,减少警告出现,可利用AS的Optimize Imports(Settings → Keymap → Optimize Imports)快捷键;
2、命名规范
代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。即使纯拼音命名方式也要避免采用。但alibaba、taobao、youku、hangzhou等国际通用的名称,可视同英文。
2.1包名
包名全部小写,连续的单词只是简单地连接起来,不使用下划线,采用反域名命名规则,全部使用小写字母。
一级包名是顶级域名,通常为com,edu,gov,net,org等,二级包名为公司名,三级包名根据应用进行命名,后面就是对包名的划分了,关于包名的划分,使用按功能分。
目前进行统一
一级包名为com
二级包名为jeno
三级包名根据应用来进行命名 如智农联-->com.jeno.bigfarmer
2.2类名
- 类名都以UpperCamelCase风格编写。
- 类名通常是名词或名词短语,接口名称有时可能是形容词或形容词短语。
- 名词,采用大驼峰命名法,尽量避免缩写,除非该缩写是众所周知的, 比如HTML, URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写。
- 接口(interface)命名规则与类一样采用大驼峰命名法,以able结尾
interface Runnable
注意:如果项目采用MVP,所有Model、View、Presenter的接口都以I为前缀,不加后缀,其他的接口采用上述命名规则。
接口类 | 描述 | 例如 |
---|---|---|
ILoginView | 登录的View层 | 登录View层一些接口的定义 |
ILoginPresent | 登录的Present层 | 登录Present层一些接口的定义 |
ILoginPresent | 登录的Present层 | 登录Present层一些接口的定义 |
... | ... | ... |
类 | 描述 | 例如 |
---|---|---|
Activity 类 | Activity为后缀标识 | 欢迎页面类WelcomeActivity |
Adapter类 | Adapter 为后缀标识 | 新闻详情适配器 NewDetailAdapter |
解析类 | Parser为后缀标识 | 首页解析类HomePosterParser |
工具方法类 | Utils或Manager为后缀标识(与系统或第三方的Utils区分)或功能+Utils | 线程池管理类:ThreadPoolManager日志工具类:LogUtils(Logger也可)打印工具类:PrinterUtils |
数据库类 | 以DBHelper后缀标识 | 新闻数据库:NewDBHelper |
Service类 | 以Service为后缀标识 | 时间服务TimeService |
BroadcastReceiver类 | 以Receiver为后缀标识 | 推送接收JPushReceiver |
ContentProvider类 | 以Provider为后缀标识 | ShareProvider |
自定义的共享基础类 | 以Base开头 | BaseActivity,BaseFragment |
... | ... | ... |
2.3方法名
方法名都以lowerCamelCase风格编写。
方法名通常是动词或动词短语。
方法 | 描述 |
---|---|
initXX() | 始化相关方法,使用init为前缀标识,如初始化布局initView() |
isXX() checkXX() | 方法返回值为boolean型的请使用is或check为前缀标识 |
getXX() | 返回某个值的方法,使用get为前缀标识 |
setXX() | 设置某个属性值 |
handleXX()/processXX() | 对数据进行处理的方法 |
displayXX()/showXX() | 弹出提示框和提示信息,使用display/show为前缀标识 |
updateXX() | 更新数据 |
saveXX() | 保存数据 |
resetXX() | 重置数据 |
clearXX() | 清除数据 |
removeXX() | 移除数据或者视图等,如removeView(); |
drawXX() | 绘制数据或效果相关的,使用draw前缀标识 |
2.4常量名
常量名命名模式为CONSTANT_CASE,全部字母大写,用下划线分隔单词。
2.5非常量字段名
非常量字段名以lowerCamelCase风格的基础上改造为如下风格:
基本结构为scopeVariableNameType。
scope:范围
非公有,非静态字段命名以m开头。
静态字段命名以s开头。
公有非静态字段命名以p开头。
公有静态字段(全局变量)命名以g开头。
例子:
非常量 | 描述 |
---|---|
private int mPrivate | 非公有,非静态字段命名以m开头。 |
protected int mPrivate | 非公有,非静态字段命名以m开头。 |
private static MyClass sSingletion | 静态字段命名以s开头。 |
public int pField | 公有非静态字段命名以p开头。 |
public static int gField | 公有静态字段(全局变量)命名以g开头。 |
考虑到Android中使用很多UI控件,为避免控件和普通成员变量混淆以及更好达意,所有用来表示控件的成员变量统一加上控件缩写作为前缀。(忽略上面的定义 不用加入 m s p g 等...) 建议使用 ButterKnife
名称 | 缩写 | 使用 |
---|---|---|
TextView | tv | tvLogin |
EditText | et | ... |
ImageButton | ib | ... |
Button | btn | ... |
ImageView | iv | ... |
ListView | lv | ... |
GridView | gv | ... |
ProgressBar | pb | ... |
SeekBar | sb | ... |
RadioButtion | rb | ... |
CheckBox | cb | ... |
ScrollView | sv | ... |
LinearLayout | ll | ... |
FrameLayout | fl | ... |
RelativeLayout | rl | ... |
RecyclerView | rv | ... |
WebView | wv | ... |
VideoView | vv | ... |
Spinner | spn | ... |
ToggleButton | tb | ... |
对于普通变量一般不添加类型后缀,如果统一添加类型后缀
用统一的量词通过在结尾处放置一个量词,就可创建更加统一的变量,它们更容易理解,也更容易搜索。
例如,请使用 mCustomerStrFirst 和 mCustomerStrLast ,而不要使用mFirstCustomerStr和mLastCustomerStr。
量词列表 | 量词后缀说明 |
---|---|
First | 一组变量中的第一个 |
Last | 一组变量中的最后一个 |
Next | 一组变量中的下一个变量 |
Prev | 一组变量中的上一个 |
Cur | 一组变量中的当前变量 |
另外注意 : 集合添加如下后缀:List、Map、Set
数组添加如下后缀:Arr
注意:所有的VO(值对象)统一采用标准的lowerCamelCase风格编写,所有的DTO(数据传输对象)就按照接口文档中定义的字段名编写。
2.6参数名
参数名以lowerCamelCase风格编写。
参数应该避免用单个字符命名。
2.7参数名
参数名以lowerCamelCase风格编写。
2.8 临时变量
临时变量通常被取名为i、j、k、m和n,它们一般用于整型;c、d、e,它们一般用于字符型。 如:for (int i = 0; i < len ; i++)。
2.9 类型变量名
类型变量可用以下两种风格之一进行命名:
单个的大写字母,后面可以跟一个数字(如:E, T, X, T2)。
具体的命名规范按照类的名字命名,不过后面加上一个大写的 T
(如:RequestT, FooBarT
)
3、 资源文件规范
3.1 资源布局文件(XML文件(layout布局文件))
全部小写,采用下划线命名法
3.1.1 contentView命名
必须以全部单词小写,单词间以下划线分割,使用名词或名词词组。
所有Activity或Fragment的contentView必须与其类名对应,对应规则为:将所有字母都转为小写,将类型和功能调换(也就是后缀变前缀)。
例如:activity_main.xml
3.1.2 Dialog命名
规则:dialog_描述.xml
例如:dialog_hint.xml
3.1.3 PopupWindow命名
规则:ppw_描述.xml
例如:ppw_info.xml
3.1.4 列表项命名
规则:item_描述.xml
例如:item_city.xml
3.1.5 包含项命名
规则:模块(位置)描述.xml
例如:activity_main_head.xml
、activity_main_bottom.xml
注意:通用的包含项命名采用:项目名称缩写_描述.xml
例如:xxxx_title.xml
3.1.6 资源文件(图片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 | 白色分割线 用途_颜色 |
bg_main_head | 主模块头部背景图片 用途_模块名_逻辑名称 |
def_search_cell | 默认搜索界面单元图片 用途_模块名_逻辑名称 |
ic_more_help | 更多帮助图标 用途_逻辑名称 |
divider_list_line | 列表分割线 用途_逻辑名称 |
selector_search_ok | 搜索界面确认选择器 用途_模块名_逻辑名称 |
shape_music_ring | 音乐界面环形形状 用途_模块名_逻辑名称 |
如果有多种形态,如按钮选择器: btn_xx.xml(selector)
名称 | 说明 |
---|---|
btn_xx | 按钮图片使用 btn_整体效果 (selector) |
btn_xx_normal | 按钮图片使用btn_正常情况效果 |
btn_xx_pressed | 按钮图片使用btn_点击时候效果 |
btn_xx_focused | state_focused 聚焦效果 |
btn_xx_disabled | state_enabled (false) 不可用效果 |
btn_xx_checked | state_checked 选中点击效果 |
btn_xx_selected | state_selected 选中效果 |
btn_xx_hovered | state_hovered 悬停效果 |
btn_xx_checkable | state_checkable 可选效果 |
btn_xx_activated | state_activated 激活的 |
btn_xx_windowfocused | state_window_focused |
注意:使用AndroidStudio的插件SelectorChapek可以快速生成selector,前提是命名要规范。
3.2 动画文件(anim文件夹下)
全部小写,采用下划线命名法,加前缀区分。
具体动画采用以下规则:模块名_逻辑名称
。
例如:refresh_progress.xml、market_cart_add.xml、market_cart_remove.xml。
普通的tween动画采用如下表格中的命名方式:动画类型_方向
名称 | 说明 |
---|---|
fade_in | 淡入 |
fade_out | 淡出 |
push_down_in | 从下方推入 |
push_down_out | 从下方推出 |
push_left | 推向左方 |
slide_in_from_top | 从头部滑动进入 |
zoom_enter | 变形进入 |
slide_in | 滑动进入 |
shrink_to_middle | 中间缩小 |
3.3 values中name命名
3.3.1 colors.xml
colors的name命名使用下划线命名法,在你的colors.xml
文件中应该只是映射颜色的名称一个ARGB值,而没有其它的。不要使用它为不同的按钮来定义ARGB值。
进行这样定义 讲一个风格的颜色放到一起
#FFFFFF
#DBDBDB
#939393
#5F5F5F
#323232
#27D34D
#2A91BD
#FF9D2F
#FF432F
3.3.2 dimens.xml
像对待colors.xml一样对待dimens.xml文件 与定义颜色调色板一样,你同时也应该定义一个空隙间隔和字体大小的“调色板”。 如下所示:
22sp
18sp
15sp
12sp
40dp
24dp
14dp
10dp
4dp
60dp
40dp
32dp
3.3.3 strings.xml
strings的name命名使用下划线命名法,采用以下规则:模块名+逻辑名称
,这样方便同一个界面的所有string都放到一起,方便查找。
名称 | 说明 |
---|---|
main_menu_about | 主菜单按键文字 |
friend_title | 好友模块标题栏 |
friend_dialog_del | 好友删除提示 |
login_check_email | 登录验证 |
dialog_title | 弹出框标题 |
button_ok | 确认键 |
loading | 加载文字 |
3.3.3 styles.xml
style
的name
命名使用大驼峰命名法,几乎每个项目都需要适当的使用style文件,因为对于一个视图来说有一个重复的外观是很常见的,将所有的外观细节属性(colors、padding、font)放在style文件中。例如:
应用到```TextView```中:
android:layout_height="wrap_content"
android:text="@string/price"
style="@style/ContentText"
/>
#####3.4 strings.xml
layout中的id命名
命名模式为:```view缩写_模块名_逻辑名```,比如```btn_main_search```
####4 注释规范
#####4.1类注解
每个类完成后应该有作者姓名,该类的作用等信息
/**
author : Blankj
e-mail : xxx@xx
time : 2017/03/07
desc : xxxx描述
version: 1.0
*/
public class WelcomeActivity {
...
}
上面的配置 在as中 Settings → Editor → File and Code Templates → Includes → File Header,输入
/**
author : ${USER}
e-mail : xxx@xx
time : ${YEAR}/${MONTH}/${DAY}
desc :
version: 1.0
*/
#####4.2方法注释
每一个成员方法(包括自定义成员方法、覆盖方法、属性方法)的方法头都必须做方法头注释。
/**
- bitmap转byteArr
- @param bitmap bitmap对象
- @param format 格式
- @return 字节数组
*/
public static byte[] bitmap2Bytes(Bitmap bitmap, CompressFormat format) {
if (bitmap == null) return null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(format, 100, baos);
return baos.toByteArray();
}
#####4.3其他一些注释
AS已帮你集成了一些注释模板,我们只需要直接使用即可
// TODO: 17/3/14 需要实现,但目前还未实现的功能的说明
// FIXME: 17/3/14 需要修正,甚至代码是错误的,不能工作,需要修复的说明
###5其他一些规范
- 1、合理布局,有效运用``````、``````、``````标签;
- 2、```Activity```和```Fragment```里面有许多重复的操作以及操作步骤,所以我们都需要提供一个```BaseActivity```和```BaseFragment```,让所有的Activity和Fragment都继承这个基类。
- 3、方法基本上都按照调用的先后顺序在各自区块中排列;
- 4、相关功能作为小区块放在一起(或者封装掉);
- 5、当一个类有多个构造函数,或是多个同名方法,这些函数/方法应该按顺序出现在一起,中间不要放进其它函数/方法;
- 6、数据提供统一的入口。无论是在 MVP、MVC 还是 MVVM 中,提供一个统一的数据入口,都可以让代码变得更加易于维护。比如可使用一个```DataManager```,把 ```http、preference```、```eventpost```、```database``` 都放在```DataManger```里面进行操作,我们只需要与DataManger打交道;
- 7、多用组合, 少用继承;
- 8、提取方法, 去除重复代码。对于必要的工具类抽取也很重要,这在以后的项目中是可以重用的。
- 9、尽可能使用局部变量;
- 10、及时关闭流;
- 11、尽量减少对变量的重复计算;
for (int i = 0; i < list.size(); i++) {
...
}
改为
for (int i = 0, int length = list.size(); i < length; i++) {
...
}
- 12、采用懒加载的策略,即在需要的时候才创建;
String str = "aaa";
if (i == 1) {
list.add(str);
}
建议替换为:
if (i == 1) {
String str = "aaa";
list.add(str);
}
- 13、不要在循环中使用try…catch…,应该把其放在最外层;
目前就是这些 希望在用的时候有什么问题的进行补充或者修改。