在团队开发项目中,统一的命名规范与编码风格非常重要,只有这样才像一个优秀团队开发的产品。而且这样方便阅读其他人的代码,便于后期维护。我觉得 Android 源码的可读性很好,风格统一,而在实际项目中经常看到混乱的风格,缩进有的是tab
有的是space
,命名有的是中文拼音有的是英文,看上去非常的乱。相信大家都喜欢简洁整齐的代码,这就需要团队成员稍微牺牲下个性,遵守统一的规范,自己读起来也赏心悦目。下面我根据自己的一些编码规范和网上的一些资料整理出一套 Android 命名规范,至于编码风格是根据 Google 的提供的 Android code style 略微修改而成,直接在 Android Studio 导入即可, 所以下面主要是介绍命名规范内容。
1. Android 命名规范
下面的命名规范,有些是我个人习惯,有不喜欢的地方可以复制后修改即可,做到简单易记就好,便于团队成员遵守。
基本命名方式
-
大驼峰命名法(UpperCamelCase):所有单词的第一个字母大写
-
小驼峰命名法(lowerCamelCase):除首单词外,其余所有单词的第一个字母大写
-
下划线命名法(case1_case2):单词与单词之间用下划线间隔,所有单词小写
一般建议用来命名的单词简单明了,不要用中文拼音,找个词典翻译下还能提高自己英文水平。有些单词可以写成一些约定俗成的缩写,也可以根据团队成员间的约定进行缩写命名。
下面使一些常用的缩写:
常用词 | 缩写 |
---|---|
Argument | arg |
Buffer | buf |
Clear | clr |
Clock | clk |
Compare | cmp |
Configuration | cfg |
Context | ctx |
Delay | dly |
Device | dev |
Display | disp |
Error | err |
function | fnct |
Hexadecimal | hex |
Initialize | init |
Maximum | max |
Message | msg |
Minimum | min |
multiplex | mux |
Parameter | param |
Previous | prev |
Priority | prio |
Register | reg |
Schedule | sched |
Synchronize | sync |
类
类名由一个或多个名词组成,采用大驼峰命名法,把类型作为最后一个单词,其他单词尽量避免缩写,除非是众所周知的,例如 HTML,URL,JSON,XML 等
类 | 命名格式 | 示例 |
---|---|---|
Activity | XXX描述 + Activity | HomeActivity |
Fragment | XXX描述 + Fragment | ContactsFragment |
Service | XXX描述 + Service | PushService |
BroadcastReceiver | XXX描述 + Receiver | NetworkReceiver |
ContentProvider | XXX描述 + Provider | BookmarkProvider |
Adapter | XXX描述 + Adapter | NewsListAdapter |
Bean | XXX描述 + Bean | PersonBean |
基础功能类 | Base + XX父类名 | BaseActivity |
工具类 | XXX描述 + Utils | BitmapUtils |
接口
命名方式和类一致,建议再加上I
前缀,表明这是一个接口,与类有所区分,例如:ILoadListener
采用小驼峰命名法,同时我觉得为了更好的区分局部变量,成员变量,静态变量,推荐加一个前缀,android 源码中也是这样的使用的。
(1)成员变量命名之前加m(member),例如mWidth,mHeight;
(2)静态成员变量命名之前加s(static),例如静态变量 sInstantce
例如,android 开发中经常有控件变量,如 TextView,ImageView 等,推荐命名方式:m+控件类型缩写 + 描述,如登陆按钮命名 mBtnLogin 。 这样可以很清楚知道这是一个Button 控件类型的局部变量,代码也会更加整洁
下面列出一些常用控件的缩写
控件 | 缩写 |
---|---|
ActionBar | ab |
LinearLayout | ll |
RelativeLayout | rl |
FrameLayout | fl |
TextView | tv |
ImageView | iv |
Button | btn |
ImageButton | imgBtn |
RadioButton | rdoBtn |
ToggleButton | tglBtn |
CheckBox | chk |
DatePicker | dtPk |
TimePicker | tmPk |
EditText | edtTxt |
ProgressBar | proBar |
SeekBar | skBar |
AutoCompleteTextView | autoTxt |
VideoView | videoVi |
WebView | webVi |
Spinner | spn |
ScrollView | sclVi |
ListView | lv |
GridView | gv |
RecyclerView | rv |
全部大写,同时采用下划线命名法,例如 MAX_THREAD_NUM
方法
采用小驼峰命名法,一般用动词或动名词
命名格式 | 说明 |
---|---|
initXX() | 初始化相关方法,如初始化布局 initLayout() |
isXX() | 是否满足某些条件,如是否连接WIFI:isWIFIConnected() |
processXX() | 处理一些数据或过程 |
showXX() | 显示XX信息 |
hideXX() | 隐藏XX信息 |
saveXX() | 保存XX |
resetXX() | 重置XX |
addXX() / insertXX() | 添加XX |
deleteXX() / removeXX() | 删除XX |
updateXX() | 更新XX |
searchXX() / findXX() / queryXX() | 查找XX |
drawXX() | 绘制XX |
onXX() | 一些状态回调,如加载成功 onLoadSuccess() |
资源文件的命名基本规则是:类型 + 描述,采用下划线命名法
1.layout 目录下文件命名
布局文件的命名需要与相应的组件对应,这样方便查找和维护,例如创建一个主页的Activity 布局文件,命名为activity_home.xml
下面是一些常用的布局命名:
布局类型 | 命名方式 |
---|---|
Activity 的布局 | activity_XX |
Fragment 的布局 | fragment_XX |
Dialog 的布局 | dialog_XX |
可include 的布局 | include_XX |
RecyclerView 的布局 | recycler_item_XX |
Drawable的命名以使用的控件作为前缀,后面再加上描述,中间以下划线分隔开
ActionBar 使用 ab_
Divider 使用 divider_
Icon 使用 ic_
Menu 使用 menu_
Button 使用 btn_login
Drawable 是有多个状态的,也应该在命名中体现出来:
Normal 对应 _normal 后缀,例如 btn_click_normal.png
Pressed 对应 _pressed 后缀
Focused 对应 _focused 后缀
Disable 对应 _disabled 后缀
Selected 对应 _selected后缀
3.Strings 和color 资源文件
也是一样使用下划线命名法,可以按照模块来划分为多个strings 文件,编译打包时会自动把同类文件进行合并
例如有 moudleA,moudleB,moduleCommon,则分为 strings_module_a, strings_module_b,strings_module_common;
colors资源文件的命名也类似,在文件内部具体某个color值的命名也可以按使用界面作为前缀,例如 主页中分隔线的颜色 命名为 home_fragment_divider
控件id
控件id 采用下划线命名法,全部都是小写。控件的ID的命名我觉得最好与之前控件命名相对应,例如之前登陆的按钮命名为 mBtnLogin,那么对应的ID 命名为 btn_login
在代码中就是 Button mBtnLogin = (Button) findViewById(R.id.btn_login); 非常清晰明了
2.Android 编码风格
编码风格的话,当然以Google 官方推荐的为标准,想要了解详细规则的请看 Android Code Style。
在实际项目中,团队成员只需要统一的code style 即可,Google Android 团队使用的文件是AndroidStyle.xml ,也可以直接使用我的 code style ,在官方的风格上稍微修改了一下,AndroidStyle.xml
<code_scheme name="AndroidStyle"> | |
<option name="AUTODETECT_INDENTS" value="false" /> | |
<option name="JAVA_INDENT_OPTIONS"> | |
<value> | |
<option name="INDENT_SIZE" value="4" /> | |
<option name="CONTINUATION_INDENT_SIZE" value="4" /> | |
<option name="TAB_SIZE" value="4" /> | |
<option name="USE_TAB_CHARACTER" value="false" /> | |
<option name="SMART_TABS" value="false" /> | |
<option name="LABEL_INDENT_SIZE" value="0" /> | |
<option name="LABEL_INDENT_ABSOLUTE" value="false" /> | |
<option name="USE_RELATIVE_INDENTS" value="false" /> | |
</value> | |
</option> | |
<option name="FIELD_NAME_PREFIX" value="m" /> | |
<option name="STATIC_FIELD_NAME_PREFIX" value="s" /> | |
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="9999" /> | |
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="9999" /> | |
<option name="IMPORT_LAYOUT_TABLE"> | |
<value> | |
<package name="com.google" withSubpackages="true" static="false" /> | |
<emptyLine /> | |
<package name="com" withSubpackages="true" static="false" /> | |
<emptyLine /> | |
<package name="junit" withSubpackages="true" static="false" /> | |
<emptyLine /> | |
<package name="net" withSubpackages="true" static="false" /> | |
<emptyLine /> | |
<package name="org" withSubpackages="true" static="false" /> | |
<emptyLine /> | |
<package name="android" withSubpackages="true" static="false" /> | |
<emptyLine /> | |
<package name="java" withSubpackages="true" static="false" /> | |
<emptyLine /> | |
<package name="javax" withSubpackages="true" static="false" /> | |
<emptyLine /> | |
<package name="" withSubpackages="true" static="false" /> | |
<emptyLine /> | |
<package name="" withSubpackages="true" static="true" /> | |
</value> | |
</option> | |
<option name="RIGHT_MARGIN" value="100" /> | |
<option name="JD_P_AT_EMPTY_LINES" value="false" /> | |
<option name="JD_DO_NOT_WRAP_ONE_LINE_COMMENTS" value="true" /> | |
<option name="JD_KEEP_EMPTY_PARAMETER" value="false" /> | |
<option name="JD_KEEP_EMPTY_EXCEPTION" value="false" /> | |
<option name="JD_KEEP_EMPTY_RETURN" value="false" /> | |
<option name="JD_PRESERVE_LINE_FEEDS" value="true" /> | |
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" /> | |
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" /> | |
<option name="BLANK_LINES_AROUND_FIELD" value="1" /> | |
<option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1" /> | |
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" /> | |
<option name="ALIGN_MULTILINE_FOR" value="false" /> | |
<option name="CALL_PARAMETERS_WRAP" value="1" /> | |
<option name="METHOD_PARAMETERS_WRAP" value="1" /> | |
<option name="EXTENDS_LIST_WRAP" value="1" /> | |
<option name="THROWS_LIST_WRAP" value="1" /> | |
<option name="EXTENDS_KEYWORD_WRAP" value="1" /> | |
<option name="THROWS_KEYWORD_WRAP" value="1" /> | |
<option name="METHOD_CALL_CHAIN_WRAP" value="1" /> | |
<option name="BINARY_OPERATION_WRAP" value="1" /> | |
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" /> | |
<option name="TERNARY_OPERATION_WRAP" value="1" /> | |
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" /> | |
<option name="FOR_STATEMENT_WRAP" value="1" /> | |
<option name="ARRAY_INITIALIZER_WRAP" value="1" /> | |
<option name="ASSIGNMENT_WRAP" value="1" /> | |
<option name="PLACE_ASSIGNMENT_SIGN_ON_NEXT_LINE" value="true" /> | |
<option name="WRAP_COMMENTS" value="true" /> | |
<option name="IF_BRACE_FORCE" value="3" /> | |
<option name="DOWHILE_BRACE_FORCE" value="3" /> | |
<option name="WHILE_BRACE_FORCE" value="3" /> | |
<option name="FOR_BRACE_FORCE" value="3" /> | |
<AndroidXmlCodeStyleSettings> | |
<option name="USE_CUSTOM_SETTINGS" value="true" /> | |
<option name="LAYOUT_SETTINGS"> | |
<value> | |
<option name="INSERT_LINE_BREAK_AFTER_LAST_ATTRIBUTE" value="true" /> | |
</value> | |
</option> | |
<option name="MANIFEST_SETTINGS"> | |
<value> | |
<option name="INSERT_LINE_BREAK_AFTER_LAST_ATTRIBUTE" value="true" /> | |
</value> | |
</option> | |
<option name="OTHER_SETTINGS"> | |
<value> | |
<option name="INSERT_LINE_BREAK_AFTER_LAST_ATTRIBUTE" value="true" /> | |
</value> | |
</option> | |
</AndroidXmlCodeStyleSettings> | |
<XML> | |
<option name="XML_ATTRIBUTE_WRAP" value="2" /> | |
<option name="XML_KEEP_BLANK_LINES" value="1" /> | |
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" /> | |
</XML> | |
<ADDITIONAL_INDENT_OPTIONS fileType="css"> | |
<option name="CONTINUATION_INDENT_SIZE" value="4" /> | |
</ADDITIONAL_INDENT_OPTIONS> | |
<ADDITIONAL_INDENT_OPTIONS fileType="js"> | |
<option name="CONTINUATION_INDENT_SIZE" value="4" /> | |
</ADDITIONAL_INDENT_OPTIONS> | |
<ADDITIONAL_INDENT_OPTIONS fileType="jsp"> | |
<option name="CONTINUATION_INDENT_SIZE" value="4" /> | |
</ADDITIONAL_INDENT_OPTIONS> | |
<ADDITIONAL_INDENT_OPTIONS fileType="sql"> | |
<option name="INDENT_SIZE" value="2" /> | |
<option name="CONTINUATION_INDENT_SIZE" value="4" /> | |
</ADDITIONAL_INDENT_OPTIONS> | |
<ADDITIONAL_INDENT_OPTIONS fileType="yml"> | |
<option name="INDENT_SIZE" value="2" /> | |
<option name="CONTINUATION_INDENT_SIZE" value="4" /> | |
</ADDITIONAL_INDENT_OPTIONS> | |
<codeStyleSettings language="Groovy"> | |
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" /> | |
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" /> | |
<option name="BLANK_LINES_AROUND_FIELD" value="1" /> | |
<option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1" /> | |
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" /> | |
<option name="ALIGN_MULTILINE_FOR" value="false" /> | |
<option name="CALL_PARAMETERS_WRAP" value="1" /> | |
<option name="METHOD_PARAMETERS_WRAP" value="1" /> | |
<option name="EXTENDS_LIST_WRAP" value="1" /> | |
<option name="THROWS_LIST_WRAP" value="1" /> | |
<option name="EXTENDS_KEYWORD_WRAP" value="1" /> | |
<option name="THROWS_KEYWORD_WRAP" value="1" /> | |
<option name="METHOD_CALL_CHAIN_WRAP" value="1" /> | |
<option name="BINARY_OPERATION_WRAP" value="1" /> | |
<option name="TERNARY_OPERATION_WRAP" value="1" /> | |
<option name="FOR_STATEMENT_WRAP" value="1" /> | |
<option name="ASSIGNMENT_WRAP" value="1" /> | |
<option name="IF_BRACE_FORCE" value="3" /> | |
<option name="WHILE_BRACE_FORCE" value="3" /> | |
<option name="FOR_BRACE_FORCE" value="3" /> | |
<option name="PARENT_SETTINGS_INSTALLED" value="true" /> | |
</codeStyleSettings> | |
<codeStyleSettings language="JAVA"> | |
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" /> | |
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" /> | |
<option name="BLANK_LINES_AROUND_FIELD" value="1" /> | |
<option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1" /> | |
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" /> | |
<option name="ALIGN_MULTILINE_FOR" value="false" /> | |
<option name="CALL_PARAMETERS_WRAP" value="1" /> | |
<option name="METHOD_PARAMETERS_WRAP" value="1" /> | |
<option name="EXTENDS_LIST_WRAP" value="1" /> | |
<option name="THROWS_LIST_WRAP" value="1" /> | |
<option name="EXTENDS_KEYWORD_WRAP" value="1" /> | |
<option name="THROWS_KEYWORD_WRAP" value="1" /> | |
<option name="METHOD_CALL_CHAIN_WRAP" value="1" /> | |
<option name="BINARY_OPERATION_WRAP" value="1" /> | |
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" /> | |
<option name="TERNARY_OPERATION_WRAP" value="1" /> | |
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" /> | |
<option name="FOR_STATEMENT_WRAP" value="1" /> | |
<option name="ARRAY_INITIALIZER_WRAP" value="1" /> | |
<option name="ASSIGNMENT_WRAP" value="1" /> | |
<option name="PLACE_ASSIGNMENT_SIGN_ON_NEXT_LINE" value="true" /> | |
<option name="IF_BRACE_FORCE" value="3" /> | |
<option name="DOWHILE_BRACE_FORCE" value="3" /> | |
<option name="WHILE_BRACE_FORCE" value="3" /> | |
<option name="FOR_BRACE_FORCE" value="3" /> | |
<option name="PARENT_SETTINGS_INSTALLED" value="true" /> | |
<indentOptions> | |
<option name="CONTINUATION_INDENT_SIZE" value="4" /> | |
</indentOptions> | |
<arrangement> | |
<groups> | |
<group> | |
<type>GETTERS_AND_SETTERS</type> | |
<order>KEEP</order> | |
</group> | |
<group> | |
<type>OVERRIDDEN_METHODS</type> | |
<order>KEEP</order> | |
</group> | |
</groups> | |
</arrangement> | |
</codeStyleSettings> | |
<codeStyleSettings language="JavaScript"> | |
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" /> | |
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" /> | |
<option name="BLANK_LINES_AROUND_FIELD" value="1" /> | |
<option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1" /> | |
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" /> | |
<option name="ALIGN_MULTILINE_FOR" value="false" /> | |
<option name="CALL_PARAMETERS_WRAP" value="1" /> | |
<option name="METHOD_PARAMETERS_WRAP" value="1" /> | |
<option name="EXTENDS_LIST_WRAP" value="1" /> | |
<option name="THROWS_LIST_WRAP" value="1" /> | |
<option name="EXTENDS_KEYWORD_WRAP" value="1" /> | |
<option name="THROWS_KEYWORD_WRAP" value="1" /> | |
<option name="METHOD_CALL_CHAIN_WRAP" value="1" /> | |
<option name="BINARY_OPERATION_WRAP" value="1" /> | |
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" /> | |
<option name="TERNARY_OPERATION_WRAP" value="1" /> | |
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" /> | |
<option name="FOR_STATEMENT_WRAP" value="1" /> | |
<option name="ARRAY_INITIALIZER_WRAP" value="1" /> | |
<option name="ASSIGNMENT_WRAP" value="1" /> | |
<option name="PLACE_ASSIGNMENT_SIGN_ON_NEXT_LINE" value="true" /> | |
<option name="WRAP_COMMENTS" value="true" /> | |
<option name="IF_BRACE_FORCE" value="3" /> | |
<option name="DOWHILE_BRACE_FORCE" value="3" /> | |
<option name="WHILE_BRACE_FORCE" value="3" /> | |
<option name="FOR_BRACE_FORCE" value="3" /> | |
<option name="PARENT_SETTINGS_INSTALLED" value="true" /> | |
</codeStyleSettings> | |
<codeStyleSettings language="XML"> | |
<indentOptions> | |
<option name="CONTINUATION_INDENT_SIZE" value="4" /> | |
</indentOptions> | |
</codeStyleSettings> | |
</code_scheme> |
导入 Code Style
Mac环境下, Android Studio -> Preferences -> Editor -> Code Style -> 点击 Manage.. -> 在弹框中点击 Import 选择下载的 AndroidStyle.xml 文件即可, 其他环境下也类似。
一开始大家的格式肯定会有不统一的时候,特别是之前的代码,可以按重新格式代码的快捷键调整格式,在 Preferences -> Keymap -> 右侧搜索框输入 reformat -> 下面 Reformat Code 对应的快捷键就是了。一般 Mac 下默认的快捷键为 Alt + Command + L 。