一、背景
每次开发都得写x.findViewById(id)是一件很繁琐的事情,后来有了butterknife,简化了书写,但是每次都去写@Bind(R.id.x),又是一件很繁琐的事情,今天我们就来偷懒下。
二、开发
先看下插件的使用:
对着layout中的文件右击鼠标选择插件【BK AutoId】—【Generate Activity】,会在剪切板中生成代码,只要java文件中黏贴就可以看到效果了。
思路:选择layout中的xml文件,取得xml文件内容,解析xml,并获取到控件类型(TextView、Button、自定义控件等等)和控件ID(R.id.x),最后拼凑出【@Bind(R.id.x)\n TextView R.id.x】的格式,复制到剪切板,黏贴使用。
首先,我们创建一个插件工程
具体插件工程怎么创建,这里就不写了(这里需要注意的是:最后一步我们选择工程模板是popup类型);
其次,我们在自动生成的actions-GenerateXML.java编写相应的代码:
实现 IObjectActionDelegate接口中的以下三个方法:
public void setActivePart(IAction action, IWorkbenchPart targetPart) {}
public void run(IAction action) {}
public void selectionChanged(IAction action, ISelection selection) {}
在plugin.xml文件中我们配置的是objectClass="org.eclipse.core.resources.IFile",所有从迭代取得的对象可以强转成IFile类型
XML的解析采用dom的解析,
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
FileInputStream fis = new FileInputStream(IFile.getContents());
Document dom = db.parse(is);
Element el = dom.getDocumentElement();
recursivePrint(el, 1);
核心:
拼接:
注意:项目中使用的butterknife-7.0.1.jar,所以我们采用的是@Bind(R.id.x)的格式,如果是不同版本的butterknife,大家自行拼接(低版本是@inject),eclipse butterknife使用可以参照butter knife
如果不想用butterknife,也可以直接findViewById:
for(XMLLayoutNodeln:retVal)
sb.append("private"+ln.getType()+""+ln.getId()+";\n");
for(XMLLayoutNodeln:retVal)
sb.append(ln.getId()+"= ("+ln.getType()+") findViewById(R.id."+ln.getId()+");\n");
三、打包使用
万事具备O(∩_∩)O:
右击工程,选择Deployable plug-ins and fragments选项并打出jar包,然后将jar包放到eclipse目录下的plugs下,重启
eclipse,选择android工程下的layout文件,右击就可以看到你的插件了。