使用 Android Studio 代码模板提高效率

本文题图:Photo by Lost Co on Unsplash

快捷输入

在编码过程中需要编写大量的重复的代码,比如,判空、log 打印,不想每次都写那么长怎么办?来试试 Android Studio 的快捷输入吧。

输入 inn 就能自动生成 if 语句及对应的大括号并把光标定位到 if 的判断条件内。

if ( != null) {

}

Android Studio 自带了许多的快捷输入模板,并细心的把它们都进行了分组,有包含 log 的,也有包含注释的,还有常量等等。

基本使用是够了,但是在某些时候我们还需要用到一下这里面没有的怎么办?答案是自己写,自己编写代码模板也不算难。先来看看吧。

试着写一下这个吧。

switch ($condition$) {
    case $case1$:
        break;
    default:
        break;
}

写完之后,记得设置适用范围,不然不能使用。

脏数据的处理

在开始学习 Android 的时候,就有就像下面这些一些不得不写的代码,如果不写的话,就会导致出现空指针,写的话又很恶心,这种代码写起来真的是让人心生厌恶。

if (info.getName() != null) {
  tvName.setText(info.getName());
}

这种代码,你在所有需要设置 Name 的地方都要写,很烦。学了一段时间之后,发现还可以这么写:

class Info {
  private String name;

  @NonNull
  public String getName() {
    return name == null ? name = "" : name;
  }
}

这样写,就很爽,慢慢的,发现,这种处理方式,确实挺不错的。直到有一天,发现有些情况下获取类中的 List 和 Map 也会为空,也得加上烦人的 if 判断,按照我的思路,我把 List 和 Map 的也实现了一下。

public List<String> getNameList() {
  return nameList == null ? nameList = new ArrayList<>() : nameList;
}

public Map<String, String> getNameMap() {
	return nameMap == null ? nameMap = new HashMap<>() : nameMap;
}

就这样,我就又能愉快的玩耍了,那天,同事在跟我抱怨烦人的 if 判断时,我就兴奋的跟他说了,我的方案,我以为他会对我表示赞同,没想到一盆冷水泼过来,说:要是一个类里面有几十个甚至几百个成员变量你怎么办?顿时泄气,他说的对,那有没有什么简单的方法呢。去搜索一波,发现 Android Studio 可以对 get,set 方法设置自定义模板。

首先打开我们要选择进行生成 get set 方法的页面,在下面的红色框的右边,点开里面就是默认的代码模板了。

我这里是有两个模板,一个是 Android Studio 默认的代码模板,一个是我自己根据默认的进行修改后的。

Get模板

修改后的模板代码在👇

#if($field.modifierStatic)
static ##
#end
$field.type ##
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.boolean && $field.primitive)
  is##
#else
  get##
#end
${name}() {
  #if($field.String)
    return $field.name == null ? "" : $field.name;
  #else
    #if($field.List)
      return $field.name == null ? $field.name = new ArrayList<>() : $field.name; 
    #else
      #if($field.Map)
        return $field.name == null ? $field.name = new HashMap<>() : $field.name;
      #else
        return $field.name;
      #end
    #end
  #end
}

文件代码模板

在日常的协作开发中,一般都会在文件的头部,标注当前文件作者,创建时间之类的,或是在新建文件的时候就内置了一些字段或是方法,那是怎么做的呢?答案就是文件代码模板。

比如使用 Android Studio 进行创建一个 Activity 而不是创建一个类然后自己继承 Activity ,那你就能得到一些默认的代码如下:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.osapling.breath.brazil.dr.R;

public class TempActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_temp);
    }
}

那我们是不是也可以自己做一些代码以此来方便我们创建类的过程呢?答案是可以的。

在 Android Studio 的 File and Code Templates 设置模块中,你可以看到这里面有多种多样的代码模板,你可以在他们的基础之上进行二次编辑,也可以完全自己写。

比如,我们可以在 Files 中进行自定义一个文件用于在项目中快速创建 Fragment。

package com.osapling.breath.mvp.view.fragment;

import android.content.Context;
import android.os.Bundle;

import com.osapling.breath.children.R;
import com.osapling.breath.children.base.BaseFragment;
import com.osapling.breath.children.base.BaseActivity;
import com.osapling.breath.children.base.IPresenter;

/**
 * @description
 * @author: Created ${USER} in ${DATE} ${TIME}
 */
public class ${name}Fragment extends BaseFragment {
    private static final String TAG = "${name}Fragment";

    private BaseActivity mBaseActivity;

    public static ${name}Fragment newInstance() {
        ${name}Fragment mFragment = new ${name}Fragment();
        mFragment.setArguments(new Bundle());
        return mFragment;
    }

    @Override
    protected int getLayoutId() {
        return R.layout.fragment_${name};
    }

    @Override
    protected IPresenter createPresenter() {
        return null;
    }

    @Override
    protected void initData() {

    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mBaseActivity = (BaseActivity) context;
    }
}

这里的文件头,我是采用使用当前模板里的文件头,如果你想不想用的话,还可以使用来自上图中与 Files 同级的 include 里的一个文件头,仅需要将那 4 行注释改为 #parse("File Header.java") 即可。