当前位置: 首页 > news >正文

浅谈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的互相传值不大会,这里推荐一个解决方案: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 = 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

 

  切记,不要使用拼音命名,即使英文这么菜的博主我开发都开着有道词典。

  最后,编码一定要写注释,你命名的如果英文不是立马能看懂的,请一定要写上注释。

     

   注释!

  注释!

   注释!

 

相关文章:

  • 实现一些常用字符串处理函数
  • [摘录]第11章 造就优势谈判的驱动力
  • java调用斑马GK888t打印机(ZPL指令)
  • 允许chrome 浏览器运行 flash player
  • 注解的使用
  • hadoop各个组件功能
  • 命令行创建虚拟机,无桌面运行virtualbox
  • 一次arp防护配置错误导致的故障
  • 框架替换主页
  • HandlerSocket安装
  • phpstorm10.0安装xdebug插件
  • 网络编程(socket,套接字)
  • selinux
  • Bzoj2756 [SCOI2012]奇怪的游戏
  • 汇新云智慧城市解决方案——以区块链加速智慧城市建设
  • 5、React组件事件详解
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • dva中组件的懒加载
  • Javascript弹出层-初探
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • java正则表式的使用
  • Python爬虫--- 1.3 BS4库的解析器
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • WePY 在小程序性能调优上做出的探究
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 码农张的Bug人生 - 初来乍到
  • 如何在 Tornado 中实现 Middleware
  • 删除表内多余的重复数据
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 项目实战-Api的解决方案
  • 在Unity中实现一个简单的消息管理器
  • 字符串匹配基础上
  • Hibernate主键生成策略及选择
  • ​io --- 处理流的核心工具​
  • (9)目标检测_SSD的原理
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (zt)最盛行的警世狂言(爆笑)
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .net FrameWork简介,数组,枚举
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net IOC框架入门之一 Unity
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • /etc/sudoers (root权限管理)
  • @PreAuthorize注解