Eclipse插件开发:Android项目中layout.xml中id快速生成

453 阅读2分钟

一、背景

每次开发都得写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) {}


把被选中的元素保存在selectionChanged变量中,因为run()方法不接受任何参数无法直接将选中的元素传递给该方法
只有当被选中的是一个IStructuredSelection对象,也就是说,是一个含有多层结构的界面元,而不是文本之类的元时,我们的run方法才开如工作

在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);

核心


取得type和ID

拼接

注意:项目中使用的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文件,右击就可以看到你的插件了。