浅谈Android编码规范及命名规范
前言:
目前工作负责两个医疗app项目的开发,同时使用leancloud进行云端配合开发,完全单挑。
现大框架已经完成,正在进行细节模块上的开发
抽空总结一下android项目的开发规范:1、编码规范 2、命名规范
注:个人经验,经供参考
一、android编码规范
1、学会使用string.xml文件
在我看来,当一个文本信息出现的次数大于一次的时候就必须要使用string.xml
比如一个保存按钮 , 不规范写法:
<button android:id="@+id/editinfo_btn_save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存" />
这里给它的文本内容设置为"保存",那么一个app中所有的保存按钮都这样写。当有一天要修改需求了,要求把“保存”文字改成“提交”,那么我们只能去一个个布局文件中修改,
岂不浪费大量时间又可能会存在漏掉修改的情况。
规范写法:
<button android:id="@+id/editinfo_btn_save" 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(1)); datas.add(new integer(2)); datas.add(new integer(3)); datas.add(new integer(4)); }
什么都不管,所有的操作代码都写在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的互相传值不大会,这里推荐一个解决方案:浅谈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 = 0; i < 10; i++) { } for (int i = 0; i < 10; 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
切记,不要使用拼音命名,即使英文这么菜的博主我开发都开着有道词典。
最后,编码一定要写注释,你命名的如果英文不是立马能看懂的,请一定要写上注释。