一、背景
每次開發都得寫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文件,右擊就可以看到你的插件了。