一、起因
想必使用AndroidStudio做开发并且使用ButterKnife的朋友们肯定听说过ButterKnifeZelezny这个组件吧,它可以一键从 布局文件中 生成对于的 View 声明和 ButterKnife 注解。
详情请看图:
真是太方便了!!!!一键生成啊有木有!!!!脱离苦海啊有木有!!!!
但是等等,我到现在还是不习惯用AndroidStudio,虽然会用但是正式开发项目,还是更加喜欢Eclipse的开发方式,于是我就在想,Eclipse有没有这样的插件呢?
显然,我想多了。
不过既然没有,那就自己做一个吧。
二、思路
俗话说“解铃还须系铃人”,既然要思路,自然就是从ButterKnifeZelezny来了,在我看来ButterKnifeZelezny主要就是几个步骤
1.解析XML
2.分析组件
3.生成ButterKnife注解
那么,我可不可以利用批处理和JAVA文件结合的方式做一个批处理文件,只要把布局文件拖入批处理文件中就可以解析出这个布局文件中有哪些组件设置了ID属性,并把这些组件和ID提取出来,最后利用字符串拼装技术把它组合成我要的写法,然后写入到系统的黏贴板中,最后由用户CTRL+V 黏贴到指定的Activity中去就可以了?
我看行!
三、开整
思路已经有了,剩下的就是开始做了,首先当然要解决的是XML解析问题。
基本上不用想太多,利用DOM4J解析就可以了。
先建立一个Java Project
然后添加工具类
LayoutUtil.java(解析布局文件的工具类)
package util; import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class LayoutUtil { /** * @author 活力橙 * @creation 2015-6-26 */ public static Map<String,String> ParseLayout(String filePath){ Map<String,String> UnitMap=new HashMap<String,String>(); Document doc = null; try { doc = new SAXReader().read(new File(filePath)); } catch (DocumentException e) { e.printStackTrace(); } Element root = doc.getRootElement(); if(root.attributeValue("id")!=null&&root.attributeValue("id").length()>0){ UnitMap.put(root.getName(), root.attributeValue("id")); } // System.out.println("根节点:"+root.getName()+",内容:"+root.attributeValue("id")); getElement(root,UnitMap); return UnitMap; } private static void getElement(Element element,Map<String,String> map){ List list = element.elements(); //递归方法 for(Iterator its = list.iterator();its.hasNext();){ Element chileEle = (Element)its.next(); if(chileEle.attributeValue("id")!=null&&chileEle.attributeValue("id").length()>0){ map.put(chileEle.getName(), chileEle.attributeValue("id")); } // System.out.println("节点:"+chileEle.getName()+",内容:"+chileEle.attributeValue("id")); getElement(chileEle,map); } } }
既然可以解析XML,那么下一步要做什么呢?当然是编写拼接字符串的工具类了,这个类也是生成ButterKnife注解格式的核心类,如果你想做别的方式的写法或者原生的写法,修改这个类就可以了。
SpellUtil.java
package util; public class SpellUtil { /** * @author 活力橙 * @creation 2015-6-26 */ public static String SpellUnit(String unit,String id){ StringBuffer parseText=new StringBuffer(); id=id.replace("@+id/", ""); parseText.append("@InjectView(R.id."+id+")"+"\r\n"); parseText.append(unit+" "+id+";"); return parseText.toString(); } }
解析也有了,拼接也有了,剩下的要做什么呢?
当然就是把拼接好的字符串复制到黏贴板上了,还是个工具类。
ClipBoard.java
package util; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; public class ClipBoard { /** * @author 活力橙 * @creation 2015-6-26 */ public static void actionPerformed(String text) { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); //获得系统粘贴板 StringSelection textInfoSelected = new StringSelection(text); //建立一个粘贴板内容实例. clipboard.setContents(textInfoSelected, null); //将textInfoSelected加入到粘贴板中; } }
OK,万事俱备,剩下的就是要写bat文件和调用的Main方法入口了。
也非常简单
CreateLayooutXml.java
<span style="font-size:18px;">package util; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; import java.util.Map; public class CreateLayooutXml { /** * @author 活力橙 * @creation 2015-6-26 */ public static void main(String[] args) { // TODO Auto-generated method stub Map<String,String> map=LayoutUtil.ParseLayout(args[0]); String parseText=""; for(Map.Entry<String, String> entry:map.entrySet()){ parseText += SpellUtil.SpellUnit(entry.getKey(),entry.getValue())+"\n"; } System.out.println(parseText); ClipBoard.actionPerformed(parseText); } }</span>
到此为止,Java方面要做的事情已经做完了,注意:
<span style="font-size:18px;">LayoutUtil.ParseLayout(args[0]);</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">这句话的意思就是编译的时候,这参数需要从批处理文件中传入,传入的内容其实就是布局文件的路径</span>
剩下的事情就是要写一个批处理文件,然后可以传入文件路径,可以执行CreateLayoutXml.java中的Main函数就可以了。
ButterKnife_Jia.bat
@echo off echo path:%~dp0 set base=%~dp0 set class=%base%\bin set libs=%base%\lib set class_path=%class%;%libs%\dom4j-1.6.1.jar; @set input= @set /p input=拖入布局文件并回车: java -classpath %class_path% util.CreateLayooutXml %input% echo %该布局的初始化内容已复制到黏贴板 @pause
好了,很好,基本上我们已经完成了这个工具的全部编码工作,这个工具的文件工程结构是这样的:
看上图,lib中放的是dom4j.jar,util中放置的是.class文件,bat文件放置在最外边。
然后开始执行bat文件
OK,批处理文件执行到这步了,等待你传入一个布局文件,只要从你的eclipse里的工程中的layout文件夹下随便拖拽一个xml到bat文件中,并按下回车就可以了,接着你就会看到
如上图所示,你的ButterKnife的写法的注解已经生成了,并且已经在你的黏贴板中了,还等什么呢,找到对应的Activity,Ctrl+V吧!!!!
下边是我Ctrl+V的哦:
@InjectView(R.id.loc_btn)
Button loc_btn;
@InjectView(R.id.loc_info)
TextView loc_info;
四、总结
其实这个小工具没什么技术难点,关键的地方还是思路和JAVA的基本功,相信大家看完之后,也可以写出很多类似这样的小组件,加油!
资源下载路径:
http://download.csdn.net/detail/jasoncol_521/8841311