Android 规范

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.xmlactivity_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

stylename命名使用大驼峰命名法,几乎每个项目都需要适当的使用style文件,因为对于一个视图来说有一个重复的外观是很常见的,将所有的外观细节属性(colors、padding、font)放在style文件中。例如:


应用到```TextView```中:

android:layout_width="wrap_content"
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…,应该把其放在最外层;


目前就是这些  希望在用的时候有什么问题的进行补充或者修改。

你可能感兴趣的:(Android 规范)