相信能开始阅读这篇文章的朋友都是从事,或者有兴趣从事Android开发的,那么,我们现在最常用的开发工具无疑就是AndroidStudio了。
那么,什么又是AndroidStudio插件呢?
AndroidStudio虽然是Google公司推出的一款很方便的开发环境,但是在实际的使用中,还是有一些功能是我们需要而它没有的,比如对vim输入方式的支持,这时候,就需要我们在它上面安装各种各样的插件来获得这些额外的功能了。
通常我们可以在AndroidStudio的右上角找到一个小小的放大镜,点击它,然后搜索plugin,就可以找到插件搜索的界面了,在这里,我们可以搜索到自己想要的插件,当然,这些插件得上传到插件库里才行,这个后面会讲到。
现在,我们装好了插件,该怎么用呢?这就要视插件的功能而定了,比如,用于支持vim输入的插件————IdeaVim,装上我们就可以开始使用,我们就能在AS里面使用Vim的快捷键和操作了,非常的厉害呢。
相信大家都听说过大名鼎鼎的ButterKnife,一款用于通过注解绑定View的第三方库,我们一旦用了它,就可以不用写长长的findViewById语句了,用几个注解就可以绑定。
再配合上AS插件——android butterknife zelezny一起使用,直接从布局自动生成相应的butterknife注解到你的代码里,真是太愉快了。
但是,事情总不是像我们想象的那么顺利,当我们愉快的使用着butterknife的时候,往往会遇到一些尴尬的情况,比如
1.ButterKnife这个第三方库每次更新之后,绑定view的注解都会改变,从bind,到inject,再到bindview,搞得很多人都不敢升级,一旦升级,就会有巨量的代码需要手动修改,非常痛苦
2.当我们有一些非常棒的代码需要拿到其他项目使用,但是我们发现,那个项目对第三方库的使用是有限制的,我们不能使用butterknife,这时候,我们又得从注解改回findviewbyid
针对上面的两种情况,如果view比较少还好说,如果有几十个view,那么我们一个个的手动删除注解,写findviewbyid语句,简直是一场噩梦(别问我为什么知道这是噩梦)
所以,这种有规律又重复简单的工作为什么不能用一个插件来实现呢?于是RemoveButterKnife的想法就出现在了笔者脑海中。
1.要开发插件,我们需要一些工具,由于AS是基于Idea开发的,其实我们开发的插件也是一个idea插件,我们需要去下载一个idea的社区版本,大家只要搜索IntelliJ Idea就可以找到了。
2.既然是用java做插件开发,肯定要设置好jdk,这个网上的资料更多,大家可以自行搜索。
有了以上两点,我们的工具就准备完毕了,就可以开始写了。
有了想法和工具,我们就可以开始编码了,但是,插件该怎么写呢?
其实,插件就是一种项目类型,我们新建项目的时候就会发现,有plugin这个类型,我们就新建一个这个类型的项目,中途会选择idea sdk,如果没有我们就新建一个(点击new 然后选择你的idea安装目录就可以了)
现在,我们有了插件项目了,我们点击src目录,这就是我们存放代码的地方,右键,新建一个Action
这里会填写一些信息
完成创建之后,我们的类代码是这样的
importcom.intellij.openapi.actionSystem.AnAction; importcom.intellij.openapi.actionSystem.AnActionEvent; public class test extends AnAction { @Override public void actionPerformed(AnActionEvent e) { // TODO: insert action logic here } }
每次我们在菜单或者快捷键激活我们的插件的时候,actionPerformed方法就会被调用,里面的代码就会执行。
到此为止,我们的第一个插件就完成了,是不是很简单呢。
知道了怎么写插件,接下来我们就要开始想一想,我们的插件应该有哪些功能了
1.适用于Activity/Fragment,使用了ButterKnife的情况
2.删除对butterknife的引用
3.删除butterknife的注解(@bind(R.id.xyz))
4.生成findviewbyid语句
5.删除ButterKnife.inject(this)等方法的使用语句
说完了功能,我们来看一个简单的对比例子,来说明到底是怎样的效果
整容前:
整容后:
有了上面的功能分析和效果图,想必大家都有了一个比较清晰的了解了,那么我们来从代码层面分析如何实现。
1.由于import语句都是固定的,我们可以直接匹配,记录行号
2.因为注解语句有很多种,我们可能需要正则表达式去匹配,并提取id和view的名字信息,并生成一个map,用来对应id和名字以及view的类型,当然,也记录下注解的行号
3.对于butterknife.method的方法调用,使用字符串匹配,也记录下来行号
4.删除记录下行号的行
5.根据记录下的id和name的map,找到oncreate/oncreateview方法,在设置了layout的代码下面生成findviewbyid语句
为了实现上述的功能,我们用了三个
1.MainAction ———— 主要用于扫描匹配,记录行号,生成id和name的map
2.DeleteAction ———— 主要用于删除记录下行号的代码
3.FindViewByIdWriter ———— 用于生成findviewbyid代码
具体的代码可以在github上面找到
地址是 RemoveButterKnife
在代码中,使用了一些idea提供的api来获取当前编辑文件的内容,并编辑,这些api都很简单,各位如果想查询的话可以到idea的支持页面上进行查找.
最后,如果你觉得这篇文章还不错的话,请我喝杯咖啡吧:)