常见Android Studio插件
1.GsonFormat
快速将json字符串转换成一个Java Bean,免去我们根据json字符串手写对应Java Bean的过程。
使用方法:快捷键Alt+S也可以使用Alt+Insert选择GsonFormat
2.AndroidButterKnife Zelezny
配合ButterKnife实现注解,从此不用写findViewById,想着就爽啊。在Activity,Fragment,Adapter中选中布局xml的资源id自动生成butterknife注解。
使用方法:Ctrl+Shift+B选择图上所示选项
3.AndroidCode Generator
根据布局文件快速生成对应的Activity,Fragment,Adapter,Menu。
4.AndroidParcelable code generator
JavaBean序列化,快速实现Parcelable接口。
5.AndroidMethods Count
显示依赖库中得方法数
6.LifecycleSorter
可以根据Activity或者fragment的生命周期对其生命周期方法位置进行先后排序,快捷键Ctrl + alt + K
7.CodeGlance
在右边可以预览代码,实现快速定位
8.findBugs-IDEA
查找bug的插件,Android Studio也提供了代码审查的功能(Analyze-Inspect Code…)
9.ADBWIFI
使用wifi无线调试你的app,无需root权限
Android wifi无线调试App新玩法ADB WIFI
10.AndroidPixelDimenGenerator
Android Studio自动生成dimen.xml文件插件
11.JsonOnlineViewer
在Android Studio中请求、调试接口
12.AndroidStyler
根据xml自动生成style代码的插件
制作Android Studio插件
插件1:生成全新的java文件
插件2:在已经存在的文件中加入代码
参考文档:https://www.w3cschool.cn/intellij_idea_doc/intellij_idea_doc-785d2ea9.html
插件1:根据输入的字符串生成全新的java文件
字符串的协议格式:
Name(字段名称) | Type(数据类型) | Desc(字段描述) |
---|---|---|
name | String | 姓名 |
age | int | 年龄 |
根据输入的name和Age生成一个包含name和Age字段的JavaBean。
制作步骤
1. 新建Plugin项目
New Project -> IntelliJ Platform Plugin,Project SDK 选择IntelliJ IDEA内置的:
因为是开发IntelliJ IDEA的插件,肯定要用IntelliJ IDEA的SDK。
2.编写plugin.xml
默认plugin.xml已经生成,需要在里面的<actions>
标签下添加action
<idea-plugin>
<id>GenerateJavabeanByString_20200223</id>
<name>GenerateJavabeanByString_20200223</name>
<version>1.0</version>
<vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>
<description><![CDATA[
Enter short description for your plugin here.<br>
<em>most HTML tags may be used</em>
]]></description>
<change-notes><![CDATA[
Add change notes here.<br>
<em>most HTML tags may be used</em>
]]>
</change-notes>
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
<idea-version since-build="173.0"/>
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
on how to target different products -->
<!-- uncomment to enable plugin in all products
<depends>com.intellij.modules.lang</depends>
-->
<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
</extensions>
<actions>
<!-- Add your actions here -->
<action id="GenerateJavabeanByString_id" class="action.GenerateJavabeanByString" text="action.GenerateJavabeanByString"
description="action的描述">
<add-to-group group-id="NewGroup" anchor="first"/>
<keyboard-shortcut keymap="$default" first-keystroke="shift ctrl alt A"/>
</action>
</actions>
</idea-plugin>
这个xml文件里面最重要的是actions标签,actions标签里面就是一个个action,action是什么?你点击IntelliJ IDEA里面任何菜单按钮出现的一个个选项都是一个个action,比如Code -> Override Methods 就是一个action。
如何在actions标签下面新建一个action,可以直接手写,当然也可以右键点击项目的src文件夹 -> New -> Plugin DevKit -> Action以可视化的方式生成action,如下图:
点击OK按钮后会在plugin.xml中生成action相关的代码,同时在src/action目录下生成了GenerateJavabeanByString类。完成后续步骤的代码,生成插件jar包,然后安装完这个插件后,当点击这个action时就会执行GenerateJavabeanByString里面的public void actionPerformed(AnActionEvent e)
方法。
3.在actionPerformed()方法里面编写代码逻辑。
public class GenerateJavabeanByString extends AnAction {
private String member = "public";
private String pasteStr = "name String\n" +
"age int\n" + "id Integer\n";
/**
* 当我们选择action的时候,就执行这里面的代码
*/
@Override
public void actionPerformed(AnActionEvent e) {
// TODO: insert action logic here
generateFile(e, "User", pasteStr);
}
private void generateFile(AnActionEvent actionEvent, String fileName, String pasteStr) {
//得到当前工程对象
Project project = actionEvent.getProject();
//得到目录服务
JavaDirectoryService directoryService = JavaDirectoryService.getInstance();
//得到当前路径(相对路径,一是点击右键的位置)
IdeView ideView = actionEvent.getRequiredData(LangDataKeys.IDE_VIEW);
PsiDirectory directory = ideView.getOrChooseDirectory();
//填入模版文件的参数
Map<String, String> map = new HashMap();
map.put("NAME", fileName);
map.put("INTERFACES", "implements Serializable");
map.put("PACKAGE_NAME", CommonUtil.getPackageName(project));
//模版做好了,就可以生成文件
PsiClass psiClass = directoryService.createClass(directory, fileName, "GenerateFileByString", false, map);
//开始加入字段
WriteCommandAction.runWriteCommandAction(project,
new Runnable() {
@Override
public void run() {
generateModelField(pasteStr, project, psiClass);
}
});
}
private void generateModelField(String pasteStr, Project project, PsiClass psiClass) {
if (psiClass == null) {
return;
}
PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory();
//根据用户输入的字符串生产出代码来
//"name String\n"+"age int\n";
String[] lineString = pasteStr.split("\n");
StringBuilder sb = new StringBuilder();
for (String line : lineString) {
String[] temp = line.split(" ");
String fieldName = temp[0];
String fieldType = temp[1];
//public String name;
sb.append(member + " " + fieldType + " " + fieldName + ";");
PsiField field = factory.createFieldFromText(sb.toString(), psiClass);
psiClass.add(field);
sb.delete(0, sb.length());
}
}
}
4.生成jar包
点击Build -> Prepare Plugin Module ‘GenerateJavabeanByString’ for Deployment 即可在项目中生成GenerateJavabeanByString.jar这个jar包。
生成的jar包就是插件,可以发布到插件市场供别人下载使用。
5.使用插件
安装插件后,选择项目的src文件夹,右键 -> New -> GenerateJavabeanByString, 输入字符串,即可在该目录下生成一个java类。
插件2:在已经存在的java类文件中加入代码
这个插件可以实现用鼠标选择布局文件的名称后自动生成Butterknife的注入相关的代码。
类似的插件已经很多了,比如:Android ButterKnife Zelezny,在Android Studio的Plugins中搜索安装即可使用,但是本文主要是用Butterknife插件来讲解源码时注入技术的原理。
整体思路:
根据用户选择的xml文件名称,提取出xml文件中有id属性的View节点,得到所有View元素,然后根据这些View元素生成UI相关的代码。
代码逻辑编写完成后,参考上述生成jar包的步骤生成jar包,然后安装插件,即可使用。
使用效果:
MainActivity的代码如下:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
鼠标选择布局文件名称activity_main,然后点击Code->ButterknifePluginDemo,在弹出的对话框中选择要生成代码的View,点击确定即自动生成相关的代码,自动帮我们完成了控件注入和事件注入。
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@BindView(R.id.frameLayout)
public FrameLayout mFrameLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@OnClick(R.id.frameLayout)
public void frameLayoutClick(FrameLayout frameLayout) {
}
}
我们只要在frameLayoutClick()方法中写点击事件相关的逻辑代码就可以了。
上面的类似这种:
@BindView(R.id.frameLayout)
public FrameLayout mFrameLayout;
@OnClick(R.id.frameLayout)
public void frameLayoutClick(FrameLayout frameLayout) {
}
的代码就不需要我们手写了,当大型项目中的布局文件复杂时,这种代码还是很多的,虽然简单,但是手写也需要花费很长的时间,我们尽量不要写这种重复又没有任何逻辑的模板代码。