Android开发规范(1)

| Tabs | tab_ | tab_pressed.9.png |

icons文件的命名规范

| Asset Type | Prefix 前缀 | Example |

| — | — | — |

| Icons | ic_ | ic_star.png |

| Launcher icons | ic_launcher | ic_launcher_calendar.png |

| Menu icons and Action Bar icons | ic_menu | ic_menu_archive.png |

| Status bar icons | ic_stat_notify | ic_stat_notify_msg.png |

| Tab icons | ic_tab | ic_tab_recent.png |

| Dialog icons | ic_dialog | ic_dialog_info.png |

选择器状态文件的命名规范

| State | Suffix 尾缀 | Example |

| — | — | — |

| Normal | _normal | btn_order_normal.9.png |

| Pressed | _pressed | btn_order_pressed.9.png |

| Focused | _focused | btn_order_focused.9.png |

| Disabled | _disabled | btn_order_disabled.9.png |

| Selected | _selected | btn_order_selected.9.png |

Layout files 布局文件命名规范

| Component 组件 | Class Name | Layout Name |

| — | — | — |

| Activity | UserProfileActivity | activity_user_profile.xml |

| Fragment | SignUpFragment | fragment_sign_up.xml |

| Dialog | ChangePasswordDialog | dialog_change_password.xml |

| AdapterView Item | — | item_person.xml |

anim动画文件命名规范

普通的tween动画采用:动画类型_方向

| 名称 | 说明 |

| — | — |

| fade_in | 淡入 |

| fade_out | 淡出 |

| push_down_in | 从下方推入 |

| push_down_out | 从下方推出 |

| push_left | 推向左方 |

| slide_in_from_top | 从头部滑动进入 |

| zoom_enter | 变形进入 |

| slide_in | 滑动进入 |

| shrink_to_middle | 中间缩小 |

关于资源文件的存放位置:

布局文件放在res/layout文件夹下,这个不用说了,attrs.xml(自定义属性)、colors.xml、dimens.xml、styles.xml、strings.xml等应该放到res/values文件夹下, 如果你有国际化语言,可能要针对strings.xml建立不同的values文件夹,如res/values-en.xml、res/values-zh.xml等,动画放在res/anim文件夹下,颜色选择器放在res/color文件夹下, 菜单放在res/menu下,res/raw可以放媒体资源,原生不动的资源可以放main/assets下,drawable选择器以及图片资源放在在res/drawable目录下,drawable又分多个,至于保留哪个drawable-xxx(减少apk体积)由团队根据主流机型自行决定。关于图片资源在drawable目录下存放具体哪个目录,涉及屏幕适配,这里不展开讨论,可以参考判断手机读取drawable哪一个目录下的图片 和Android屏幕适配全攻略

关于app应用图标,在android studio中是放在mipmap目录下的,新版当中还提供了一种圆形的图标icon。

Android代码规范之变量命名规范

==================

java普通的变量命名规则一般采用小驼峰命名规则。

1. 全局变量


按照驼峰规则命名,全局变量首字母以m开头(非静态),如mContext,  可以参考Google Android源码中的命名

变量命名要做到足够长有一定意义,同时又足够短以避免冗长。

关于携带Android控件的变量,个人建议规则:【控件逻辑名称】+【控件缩写】

如mLoginBtn, mBottomLayout, mTitleText, 能用全名的可以尽量用全名不用缩写如mLoginButton,

但绝对不要写成mDialog1, mDialog2, mBtn1, mBtn2等等这样的。命名要做到见名知义。

2. 局部变量


局部变量也是按照驼峰规则命名,前面不用加m, 如loginBtn,resultString,loginPresenter,

不能有下划线之类的如myname_text, btn_commit。命名要做到见名知义。

尽量用简洁的单词描述,但是避免单个字符如a, b,i,j, 除非是临时变量循环变量在for循环中使用。

常见单词的缩写:

| 单词 | 缩写 |

| — | — |

| icon | ic |

| background | bg |

| foreground | fg |

| initial | init |

| information | info |

| success | succ |

| failure | fail |

| error | err |

| image | img |

| library | lib |

| message | msg |

| password | pwd |

| length | len |

| buffer | buf |

| position | pos |

能用全称的尽量用全称不用缩写。另外缩写尽量不要使用拼音和英文及数字混拼。

3. 静态变量/常量


不同于前两种,静态常量(static/final)一般应该全部大写,中间用下划线分开。命名要做到见名知义。

4. 方法名


采用驼峰命名规则。首单词首字母小写,其余单词首字母大写。尽量不要使用下划线。

命名要做到见名知义。函数名如果过长,部分常见单词可以采用缩写表示。

方法名通常是动词或动词短语。

| 方法 | 说明 |

| — | — |

| 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前缀标识 |

5. 控件Id


全部采用小写,单词之间使用下划线分割。命名要做到见名知义。避免btn1, btn2, mynametextview这样的。

个人建议xml中的资源id命名规则以:【控件缩写】+【控件逻辑名称】(跟代码中反过来)为主,

例:

  • btn_login

  • edit_accout

  • iv_message

  • lv_news

  • tv_name

常用控件的缩写

| 控件 | 布局文件中缩写 | 代码中缩写 |

| — | — | — |

| LinearLayout | ll_xxx | xxxLay或xxxLayout |

| RelativeLayout | rl_xxx | xxxRLayout |

| FrameLayout | fl_xxx | xxxFLayout |

| TextView | tv_xxx | xxxTv或xxxTextView |

| EditText | edit_xxx | xxxEt或xxxEdit |

| Button | btn_xxx | xxxBtn或xxxButton |

| ImageView | iv_xxx | xxxIv或xxxImg |

| CheckBox | chk_xxx | xxxChk或xxxCheckBox |

| RadioButton | rbtn_xxx |

xxxRbtn或xxxRadioButton

|

| ProgressBar | pbar_xxx | xxxPbar或xxxProgressBar |

| ListView | lv_xxx |

xxxLv或xxxListView

|

| WebView | wv_xxx |

xxxWv或xxxWebView

|

| GridView | gv_xxx |

xxxGv或xxxGridView

|

6. strings.xml dimens.xml colors.xml等变量命名


strings.xml

strings的name命名使用下划线命名法,采用以下规则:模块名+逻辑名称,这样方便同一个界面的所有string都放到一起,方便查找。

| 名称 | 说明 |

| — | — |

| main_menu_about | 主菜单按键文字 |

| friend_title | 好友模块标题栏 |

| friend_dialog_del | 好友删除提示 |

| login_check_email | 登录验证 |

| dialog_title | 弹出框标题 |

| button_ok | 确认键 |

| loading | 加载文字 |

colors.xml

colors.xml的name命名使用下划线命名法,在你的colors.xml文件中应该只是映射颜色的名称一个ARGB值,而没有其它的。

不要使用它为不同的按钮来定义ARGB值。

不要这样做

#FFFFFF

#2A91BD

#5F5F5F

#939393

#FFFFFF

#FF9D2F

#323232

使用这种格式,你会非常容易的开始重复定义ARGB值,这使如果需要改变基本色变的很复杂。

同时,这些定义是跟一些环境关联起来的,如button,应该放到一个按钮风格中,而不是在colors.xml文件中。

相反,这样做

#FFFFFF

#DBDBDB

#939393

#5F5F5F

#323232

#27D34D

#2A91BD

#FF9D2F

#FF432F

像这样规范的颜色很容易修改或重构,会使应用一共使用了多少种不同的颜色变得非常清晰。

通常一个具有审美价值的UI来说,减少使用颜色的种类是非常重要的。

注意:如果某些颜色和主题有关,那就单独写一个colors_theme.xml

dimens.xml

像对待colors.xml一样对待dimens.xml文件,dimens命名应该按照一套统一的规则。 一个好的例子:

<resources>

<dimen name=“font_22”>22sp</dimen>

<dimen name=“font_18”>18sp</dimen>

<dimen name=“font_15”>15sp</dimen>

<dimen name=“font_12”>12sp</dimen>

<dimen name=“spacing_40”>40dp</dimen>

<dimen name=“spacing_24”>24dp</dimen>

<dimen name=“spacing_14”>14dp</dimen>

<dimen name=“spacing_10”>10dp</dimen>

<dimen name=“spacing_4”>4dp</dimen>

<dimen name=“button_height_60”>60dp</dimen>

<dimen name=“button_height_40”>40dp</dimen>

<dimen name=“button_height_32”>32dp</dimen>

</resources>

布局时需要尺寸大小时进行引用,像这样规范的尺寸很容易修改或重构,会使应用所有用到的尺寸一目了然,会使组织和改变风格或布局是非常容易。

styles.xml

style的name命名使用大驼峰命名法。几乎每个项目都需要适当的使用style文件,因为对于一个视图来说有一个重复的外观是很常见的。

将所有的外观细节属性(colors、padding、font)放在style文件中。 在应用中对于大多数文本内容,最起码你应该有一个通用的style文件,例如:

应用到TextView中:

`<TextView

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“@string/price”

style=“@style/ContentText”`

/>

需要为控件做重复的事情时,可以将重复的属性放到通用的style中。

Android代码规范之代码样式规范

==================

Android开发代码样式(format)一般按照Google默认提供的格式:

可以在settings设置中去修改,但一般我们不做修改,统一用默认的样式即可。除非有特殊要求。

一些需要注意的:

1. 大括号


大括号与if, else, for, do, while语句一起使用,即使只有一条语句(或是空),也应该把大括号写上。

2. 非空块:K & R 风格


对于非空块和块状结构,大括号遵循 Kernighan 和 Ritchie 风格 (Egyptian brackets):

  • 左大括号前不换行

  • 左大括号后换行

  • 右大括号前换行

  • 如果右大括号是一个语句、函数体或类的终止,则右大括号后换行; 否则不换行。

例如,如果右大括号后面是else或逗号,则不换行。

示例:

new MyClass() {

@Override public void method() {

if (condition()) {

try {

something();

} catch (ProblemException e) {

recover();

}

}

}

};

3.一行一个语句


每个语句后要换行。

4.块缩进:4个空格


每当开始一个新的块,缩进增加4个空格,当块结束时,缩进返回先前的缩进级别。缩进级别适用于代码和注释。

最好使用4个空格代替Tab,在不同的编译环境中,Tab所表示的长度可能不一致。

5.自动换行


术语说明:一般情况下,一行长代码为了避免超出列限制(80或100个字符)而被分为多行,我们称之为自动换行(line-wrapping)。

我们并没有全面,确定性的准则来决定在每一种情况下如何自动换行。很多时候,对于同一段代码会有好几种有效的自动换行方式。

从哪里断开:

自动换行的基本准则是:更倾向于在更高的语法级别处断开。

  1. 如果在非赋值运算符处断开,那么在该符号前断开(比如+,它将位于下一行)。

  2. 这条规则也适用于以下"类运算符"符号:点分隔符(.),类型界限中的 &(),catch 块中的catch符号。

  3. 如果在赋值运算符处断开,通常的做法是在该符号后断开(比如=,它与前面的内容留在同一行)。

  4. 方法名或构造函数名与左括号留在同一行。

  5. 逗号(,)与其前面的内容留在同一行。

6.空行


以下情况需要使用一个空行:

  1. 类内连续的成员之间:字段,构造函数,方法,嵌套类,静态初始化块,实例初始化块。 例外: 两个连续字段之间的空行是可选的,用于字段的空行主要用来对字段进行逻辑分组。

  2. 在函数体内,语句的逻辑分组间使用空行。

  3. 多个连续的空行是允许的,但没有必要这样做(我们也不鼓励这样做)。

7.空格


以下情况需要使用一个空格:

  1. 分隔任何保留字与紧随其后的左括号(()(如if, for catch等)。

  2. 分隔任何保留字与其前面的右大括号(})(如else, catch)。

  3. 在任何左大括号前({),两个例外:

o @SomeAnnotation({a, b})(不使用空格)。

o String[][] x = foo;(大括号间没有空格)。

  1. 在任何二元或三元运算符的两侧。这也适用于以下"类运算符"符号:

o 类型界限中的&()。

o catch块中的管道符号(catch (FooException | BarException e)。

o foreach语句中的分号。

  1. 在, : ;及右括号())后

  2. 如果在一条语句后做注释,则双斜杠(//)两边都要空格。这里可以允许多个空格,但没有必要。

  3. 类型和变量之间:List list。

  4. 数组初始化中,大括号内的空格是可选的,即new int[] {5, 6}和new int[] { 5, 6 }都是可以的。

8.每次只声明一个变量


不要推荐使用组合声明,比如int a, b;。如非必须,变量在需要的时候才去声明并初始化。

9.方法参数不宜过多


如果方法参数太多,函数声明方法名会很长,可以考虑用实体类来封装参数。

10.方法中的行数不宜过多


如果方法长度没有统一标准规定,因为有的方法确实会很长,但是一般来说当方法长度超过50行左右,可以考虑优化进行方法提取(refactor)。

例如最常见的在Activity的onCreate方法中写过长的代码:

不要这样做

相反,这样做

是不是简洁清晰了很多

Android代码规范之代码注释

================

好的代码需要一套规范的注释方法

  1. 一个工程应有一个统一的头文件注释,以说明整个工程的信息、创建日期、版本等等

  2. 对重要的程序必须加注释进行说明

  3. 修改代码或删除时,将原代码用注释的方法屏蔽,同时要加开发者自身对修改操作的注释

  4. 移除所有临时或无关的注释,以避免在日后的维护工作中产生混乱

  5. 注释应对代码进行准确的说明,不应存在歧义

1. 类注释


原则上编写完成每个类都要有一个头部注释,标注类的功能描述,作者,联系方式和修改日期等。对自己的代码负责。

头部注释的添加有两种方式:

第一种方式,可以在AS中,Settings → Editor → File and Code Templates → Includes → File Header,输入:

/**

* 描述:添加类的描述

* @anthor $(USER)

* @e-mail XXX@XX.com

* @time   ${DATE}

*/

这样便可在每次新建类的时候自动加上该头注释。

第二种方式,在Settings → Editor → Live Templates中配置,

详情参考:http://www.cnblogs.com/zgz345/p/4994885.html

http://blog.csdn.net/pkandroid/article/details/52686199

这种方式是配置模板和对应的快捷键,比如我的配置完成后在类的开头输入lf回车就会自动生成对应的注释模板:

 

相比第一种而言,不会每个类新建都生成,只有需要的时候再手动添加,更加灵活。

2. 方法注释


原则上每一个成员方法(包括自定义成员方法、覆盖方法、属性方法)的方法头都必须做方法头注释。

在方法前一行输入/** + 回车或者设置Fix doc comment(Settings → Keymap → Fix doc  comment)快捷键,

AS便会帮你生成模板,我们只需要补全参数即可:

3. 块注释


块注释是最常用的注释,它与其周围的代码在同一缩进级别。

它们可以是/* … */风格,也可以是// …风格(//后最好带一个空格)。

对于多行的/* … */注释,后续行必须从*开始, 并且与前一行的*对齐。

一般我们还会注释掉代码,修改代码或删除时,将原代码用注释的方法屏蔽,同时要加开发者自身对修改操作的注释。

3. TODO注释


当你需要后续再对代码进行补充修改时,可以使用todo模板注释, 在代码中输入todo、fixme等这些注释模板,然后回车,

AS会自动帮你生成如下注释:

要查找之前哪些todo没有完成,可以在AS左下角todo面板中很方便的找到,AS会将你所有的todo项列出:

喜欢这个功能的可以看看这篇文章:玩转自定义TODO

4. XML注释


在XML文档中,使用如下面格式注释:

其他:配置文件或mk文件等可使用#进行注释。

Android代码规范之Log开关

=================

在代码合适的地方添加Log输出,一般情况下我们的需求是希望debug状态下的输出log, 而release的包不希望输出log。一般我们在整个应用中应该使用和建立一个统一全局的Log开关类,方便统一开关管理。

可以定义自己的boolean变量来控制开关,这里介绍利用AS的BuildConfig.DEBUG属性来控制是否输出log, gradle在编译debug包的时候BuildConfig类的DEBUG变量自动为true, 而编译release包的时候自动为false, 利用这点就可以实现在打debug包会自动输出log, 而release包的时候不会输出log。

使用的时候无需关心当前debug状态:

即便代码里到处都是TQLog调用也没关系,因为release编译的时候Log会自动编译,只会在debug时才有输出。

另外,也可以在gradle中为BuildConfig添加自己的变量来控制log开关:

则代码中的log开关换成下面这句即可:

BuildConfig文件(自动生成在/build/generated/source/buildConfig/目录下)

PS:关于BuildConfig,AS里有一个坑,AS中依赖的module默认是 release状态的,所以BuildConfig的DEBUG总是false,

详情看这里:解决依赖 library module的BuildConfig 坑(重构项目中我已按照此方案解决) (AS3.0以后的版本此方案已失效)

Android Studio Gradle统一配置规范

===========================

其实这个不能说规范了,gradle是一个配置文件,不同的人和项目可能有不同的做法,这里只是列出来做一个参考,如果团队使用AS开发并且有很多项目,那么最好所有的项目gradle配置按照统一的规范来。

下面是我在项目中使用的一个app module下的gradle文件简单配置:

apply plugin: ‘com.android.application’

//加载签名配置文件

Properties keyProps = new Properties()

keyProps.load(new FileInputStream(file(“signing.properties”)))

//加载服务器地址配置文件

Properties urlProps = new Properties()

urlProps.load(new FileInputStream(file(“url.properties”)))

android {

compileSdkVersion rootProject.ext.compileSdkVersion

buildToolsVersion rootProject.ext.buildToolsVersion

defaultConfig {

applicationId “com.aa.bb”

minSdkVersion rootProject.ext.libMinSdkVersion

targetSdkVersion 21

versionCode 5

versionName “3.1.1”

flavorDimensions “default”

manifestPlaceholders = [icon: “@drawable/app_logo”, appname: “@string/app_name”]

}

signingConfigs {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

考虑到文章的篇幅问题,我把这些问题和答案以及我多年面试所遇到的问题和一些面试资料做成了PDF文档

喜欢的朋友可以关注、转发、点赞 感谢!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

ersion

targetSdkVersion 21

versionCode 5

versionName “3.1.1”

flavorDimensions “default”

manifestPlaceholders = [icon: “@drawable/app_logo”, appname: “@string/app_name”]

}

signingConfigs {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-P1jJ0F5U-1713258202516)]

[外链图片转存中…(img-eZwM7anR-1713258202517)]

[外链图片转存中…(img-L5aAHyOT-1713258202518)]

[外链图片转存中…(img-UHdf81Ww-1713258202519)]

[外链图片转存中…(img-UEcLXoz9-1713258202520)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

考虑到文章的篇幅问题,我把这些问题和答案以及我多年面试所遇到的问题和一些面试资料做成了PDF文档

[外链图片转存中…(img-0rz9c2uD-1713258202521)]

[外链图片转存中…(img-b8zE4Pyl-1713258202522)]

喜欢的朋友可以关注、转发、点赞 感谢!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值