一、起因
想必使用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.attributeValue("id"),root.getName());
// 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.attributeValue("id"), chileEle.getName());
//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
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.getValue(),entry.getKey())+"\n";
}
System.out.println(parseText);
ClipBoard.actionPerformed(parseText);
}
}
LayoutUtil.ParseLayout(args[0]);
這句話的意思就是編譯的時候,這參數要從批處理文件中傳入,傳入的內容其實就是佈局文件的絕對路徑。
剩下的事情就是要寫一個批處理文件,然後可以傳入文件路徑,可以執行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/8841831