浅谈Android编码规范及命名规范
前言:
目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑。
现大框架已经完成,正在进行细节模块上的开发
抽空总结一下Android项目的开发规范:1、编码规范 2、命名规范
注:个人经验,经供参考
--------------------------------------------------------------------------------------------------------------------------
一、Android编码规范
1、学会使用string.xml文件
在我看来,当一个文本信息出现的次数大于一次的时候就必须要使用string.xml
比如一个保存按钮 , 不规范写法:
<Button
android:id="@+id/btnSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存"
/>
这里给它的文本内容设置为"保存",那么一个app中所有的保存按钮都这样写。当有一天要修改需求了,要求把“保存”文字改成“提交”,那么我们只能去一个个布局文件中修改,
岂不浪费大量时间又可能会存在漏掉修改的情况。
规范写法:
<Button
android:id="@+id/btnSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/save"
/>
而在string.xml文件中:
<string name="save">保存</string>
这种写法,往后需要修改,只需要在string.xml文件中修改一行代码 便实现了整个APP的该文本内容修改。
2、学会使用color.xml ,dimens.xml文件的使用
同string.xml使用一致,同学们应该都懂的,切勿因为一时的懒,导致后期的迭代费时费力。
3、团队协同确定一套标准Activity的onCreate()方法中代码执行流程
其实刚接触Android的时候,我的不规范代码是这样的:
private Button scan; //扫描按钮
private Button create; //创建按钮
private ArrayList<Object> datas; //数据源
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
create = (Button) findViewById(R.id.create);
scan = (Button) findViewById(R.id.scan);
scan.setOnClickListener(this);
create.setOnClickListener(this);
datas = new ArrayList<>();
datas.add(new Integer());
datas.add(new Integer());
datas.add(new Integer());
datas.add(new Integer());
}
什么都不管,所有的操作代码都写在onCreate()方法中,包括find控件。设置监听事件,加载数据源等等。
可以看到现在就2个控件一个数据源,代码就这么多了,如果一个界面有10多个控件呢,那onCreate()方法中的代码量就成倍数的多起来了。
所以所有的Activity都要设定一个统一的规范。
我们都知道,一个Activity中有基本都有的操作:
①、初始化变量
②、初始化控件
③、设置监听事件
④、加载网络数据并显示
那么就可以将以上的代码分门别类的放在这几个方法中
比如一段规范代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_scan; //扫描按钮
private Button btn_create; //创建按钮
private ArrayList<Object> datas; //数据源
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initVariables();
initView();
initEvent();
loadData();
}
//初始化变量,比如 上一个Activity传来的Intent的数据 本Activity中一些标记变量等
private void initVariables() {
}
//加载数据源
private void loadData() {
}
//注册监听事件
private void initEvent() {
btn_scan.setOnClickListener(this);
btn_create.setOnClickListener(this);
}
//初始化控件
private void initView() {
btn_create = (Button) findViewById(R.id.create);
btn_scan = (Button) findViewById(R.id.scan);
}
//设置点击事件
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_scan:
//扫描二维码
startActivity(new Intent(this,ScanActivity.class));
break;
case R.id.btn_create:
//生成二维码
startActivity(new Intent(this,CreateActivity.class));
break;
}
}
}
可以看到,onCreate()中就那么几个方法了,我们需要找问题的时候在相应的方法中去找即可,既方便又清晰。
其实这种操作我们可以写一个BaseActivity作为它的的抽象方法,然后让Activity继承这个BaseActivity基类重写方法即可,涉及到架构,这个往后再说。
4、团队协同确定一种控件的点击事件OnClickListener()
Android给我们提供5种给控件设置OnClick的方法,个人觉得项目中用的最多的就是
①、参数this 然后Activity 实现 View.OnClickListener接口 重写 onClick()方法
btn_create.setOnClickListener(this);
②、直接参数new OnclickListener()的
btn_create.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
其他三个方法个人觉得尽量不要用。而这两种方法中第一种 是更好的,因为我们可以通过switch--case 的方法区分不同控件的点击事件,代码更清晰简约。
当然第二种方法也是可以的,但是切记同一个项目中最好只有一种方式,便于后期的维护。
//设置点击事件
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.scan:
//扫描二维码
startActivity(new Intent(this,ScanActivity.class));
break;
case R.id.create:
//生成二维码
startActivity(new Intent(this,CreateActivity.class));
break;
}
}
5、尽量少用全局变量static进行传值操作
static的特性大家应该都是知道的,他会一直占用一部分内存,虽然很少,但是一个项目中成百上千个使用的话,对项目是非常不好的。
建议页面之间的传值还是用Intent ,实现没有好的解决方案的再用static , PS ,我之前公司的项目就非常大量的使用了static
注:有些同学可能对Activity和Fragment的互相传值不大会,这里推荐一个解决方案:Android项目实战(十三):浅谈EventBus , 对我来说是项目必备,但是也要合理运用
6、Activity中尽量不要使用内部类
这里以RecyclerView举例,一款非常棒的控件,有了它再也不用ListView了 ,浅谈RecyclerView(完美替代ListView,GridView)
一个RecyclerView是配套一个Adapter和一个ViewHolder的。
不规范做法:部分同学图省事(当然放在一个Activity中确实方便数据传输和item点击事件操作),把它们都写在一个Activity中,这样是不可取的,因为大大的增加了单个Activity的代码量,对维护来说很不方便。
规范做法: ViewHolder一个类 ,Adapter一个类 , 分工明确 ,避免一个类中代码量过多的问题。
注:ListView,ViewPager 使用同上
至于类的分类,有的同学喜欢一个功能模块放在一个包下,比如一个功能点的Activity , Adapter ,ViewHolder都放在一个包下
有的同学喜欢一种类的放在一个包下,比如将所有的Activity放在activitys包下,将所有的Adapter放在adapters包下。
这都是后话,将来学习架构的时候再详谈
7、使用ArrayList代替HashMap
据说,是据说,ArrayList使用的内存要低于HashMap,因为android手机参差不齐,所以开发过程中对内存还是非常重视的,能省则省。
PS:我的项目中基本使用的ArrayList,除非是ArrayList代替不了的数据结构
8、团队规范统一的第三方
现在方便又好用的第三方太多了,图片框架好几个优秀的,推送好几个优秀的,即时通讯好几个优秀的。
注意使用太多的第三方会导致程序过大,而且应用有一个最大方法数的限制,避免实现一种功能的第三方,团队成员使用的都是不一样的第三方。
9、统一代码格式
经典的就是for循环了, 一种是左括号放在最后,一个是另起一行。 统一下,界面看起来舒服,个人建议左括号放在最后的方式,别问我为啥,大学老师推荐的,理由:忘了。
for (int i = ; i < ; i++) {
}
for (int i = ; i < ; i++)
{
}
10、不同功能代码之间要有一行空格分开
配合的写上注释,告诉维护的同学 ,哪一段代码是进行什么操作的
为了代码清晰 也为了维护的同学少长两根头发。。
11、如果你是Android Studio开发
请频繁使用Ctrl+A --》 Ctrl +Alt + I
--------------------------------------------------------------------------------------------------------------------------
二、Android命名规范
命名规范:驼峰法,下划线分割法。
1、Java类文件
①、Activity:以Activity作为后缀,这个相信大家AS给你的都帮你做好了。
②、Adapter: 以Adapter作为后缀
③、ViewHolder: 以ViewHolder作为后缀
④、实体类Entity:以Entity作为后缀
如下,我是以功能模块分包,大神勿喷,个人喜好:

2、xml文件
①、layout.xml
Activity的布局文件以activity_ 开头,AS提供的。
列表项的布局文件listview 以 item_list_开头。
②、控件的命名
缩写,这个看个人了,
我的经验,比如:
LayoutView ---- lv
TextView ---- tv
Button ---- btn
ImageView ---- img
切记,不要使用拼音命名,即使英文这么菜的博主我开发都开着有道词典。
最后,编码一定要写注释,你命名的如果英文不是立马能看懂的,请一定要写上注释。
注释!
注释!
注释!
浅谈Android编码规范及命名规范的更多相关文章
- 浅谈android代码保护技术_ 加固
浅谈android代码保护技术_加固 导语 我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk,结果被人反编译了,那心情真心不舒服.虽然我们混淆,做到native层,但 ...
- 浅谈Android应用保护(一):Android应用逆向的基本方法
对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...
- 浅谈URLEncoder编码算法
一.为什么要用URLEncoder 客户端在进行网页请求的时候,网址中可能会包含非ASCII码形式的内容,比如中文. 而直接把中文放到网址中请求是不允许的,所以需要用URLEncoder编码地址, 将 ...
- 浅谈Hex编码算法
一.什么是Hex 将每一个字节表示的十六进制表示的内容,用字符串来显示. 二.作用 将不可见的,复杂的字节数组数据,转换为可显示的字符串数据 类似于Base64编码算法 区别:Base64将三个字节转 ...
- 浅谈Base64编码算法
一.什么是编码解码 编码:利用特定的算法,对原始内容进行处理,生成运算后的内容,形成另一种数据的表现形式,可以根据算法,再还原回来,这种操作称之为编码. 解码:利用编码使用的算法的逆运算,对经过编码的 ...
- 安卓开发_浅谈Android动画(四)
Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1. ValueAnimator 基本属 ...
- 浅谈Android应用性能之内存
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/ jaunty [博主导读]在Android开发中,不免会遇到许多OOM现象,一方面可能是由于开 ...
- 浅谈Base64编码
浅谈Base64编码 我打赌当你见到Base64这个词的时候你会觉得在哪里见过,因为在你能够上网看到这篇文章的时候你已经在后台使用它了.如果您对二进制数有所了解,你就可以开始读它了. 打开一封Emai ...
- 浅谈Android五大布局
Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...
随机推荐
- ASP.NET Core 性能对比评测(ASP.NET,Python,Java,NodeJS)
前言 性能是我们日常生活中经常接触到的一个词语,更好的性能意味着能给我们带来更好的用户体检.比如我们在购买手机.显卡.CPU等的时候,可能会更加的关注于这样指标,所以本篇就来做一个性能评测. 性能也一 ...
- Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器
最近在业余时间玩玩树莓派,刚开始的时候在树莓派里写一些基于wiringPi库的C语言程序来控制树莓派的GPIO引脚,从而控制LED发光二极管的闪烁,后来觉得,是不是可以使用HTML5+jQuery等流 ...
- 在 Linux 打造属于自己的 Vim
Linux 系统中很多东西都是以脚本代码.配置文件的形式存在,使用 Linux 系统时,需经常对这些文件进行编辑.很显然,如果没有文本编辑器,江湖之路寸步难行. 我的选择是 Vim.Vim 是 Lin ...
- 2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>
前一阵子由于个人生活原因,具体见上一篇,耽搁了一阵子,在这里也十分感谢大家支持和鼓励.现在开始继续做WPF2000系列. 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件 ...
- Alcatraz 的安装和删除
Xcode 所有的插件都安装在目录: ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/ 你也可以手工切换到这个目录来删除插件 ...
- esayui
- HTML5之应用缓存---manifest---缓存使用----Web前端manifest缓存
相信来查这一类问题的都是遇到问题或者是初学者吧! 没关系相信你认真看过之后就会知道明白的 这是HTML5新加的特性 HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连 ...
- Android混合开发之WebView使用总结
前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结. 混合开发相关博客: Android混合开发之WebView使用总结 Android混合开 ...
- spring boot(二):web综合开发
上篇文章介绍了Spring boot初级教程:spring boot(一):入门篇,方便大家快速入门.了解实践Spring boot特性:本篇文章接着上篇内容继续为大家介绍spring boot的其它 ...
- 两种方式实现java生成Excel
Web应用中难免会遇到需要将数据导出并生成excel文件的需求.同样,对于本博客中的总结,也是建立在为了完成这样的一个需求,才开始去了解其实现形式,并且顺利完成需求的开发,先将实现过程总结于此.本博文 ...