布局自动化处理方法

本文介绍了一个使用Java实现的批处理工具,该工具可以从Android布局XML文件中提取视图ID和名称,自动生成适用于ButterKnife的注解,并将其复制到剪贴板。该工具简化了在Eclipse环境中使用ButterKnife的开发流程。

 

一、起因

      想必使用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(解析布局文件的工具类)

[java]  view plain copy
  1. package util;  
  2.   
  3. import java.io.File;  
  4. import java.util.HashMap;  
  5. import java.util.Iterator;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8. import org.dom4j.Document;  
  9. import org.dom4j.DocumentException;  
  10. import org.dom4j.Element;  
  11. import org.dom4j.io.SAXReader;  
  12.   
  13.   
  14.   
  15. public class LayoutUtil {  
  16.       
  17.     /** 
  18.     * @author 活力橙 
  19.     * @creation 2015-6-26 
  20.     */  
  21.   
  22.     public static Map<String,String> ParseLayout(String filePath){  
  23.           
  24.         Map<String,String> UnitMap=new HashMap<String,String>();  
  25.           
  26.           Document doc = null;    
  27.             try {    
  28.                 doc = new SAXReader().read(new File(filePath));    
  29.             } catch (DocumentException e) {    
  30.                 e.printStackTrace();    
  31.             }    
  32.            Element root = doc.getRootElement();    
  33.            if(root.attributeValue("id")!=null&&root.attributeValue("id").length()>0){  
  34.                  
  35.                UnitMap.put(root.attributeValue("id"),root.getName());  
  36.               // System.out.println("根节点:"+root.getName()+",内容:"+root.attributeValue("id"));  
  37.                  
  38.            }  
  39.           
  40.            getElement(root,UnitMap);  
  41.              
  42.         return UnitMap;  
  43.           
  44.           
  45.     }  
  46.       
  47.       
  48.     private static void getElement(Element element,Map<String,String> map){    
  49.         List list = element.elements();    
  50.         //递归方法     
  51.         for(Iterator its =  list.iterator();its.hasNext();){    
  52.             Element chileEle = (Element)its.next();    
  53.             if(chileEle.attributeValue("id")!=null&&chileEle.attributeValue("id").length()>0){  
  54.                  
  55.                 map.put(chileEle.attributeValue("id"), chileEle.getName());  
  56.                    //System.out.println("节点:"+chileEle.getName()+",内容:"+chileEle.attributeValue("id"));    
  57.            }  
  58.          
  59.             getElement(chileEle,map);    
  60.         }    
  61.     }     
  62.       
  63.       
  64. }  



既然可以解析XML,那么下一步要做什么呢?当然是编写拼接字符串的工具类了,这个类也是生成ButterKnife注解格式的核心类,如果你想做别的方式的写法或者原生的写法,修改这个类就可以了。


SpellUtil.java

[java]  view plain copy
  1. package util;  
  2.   
  3. public class SpellUtil {  
  4.       
  5.     /** 
  6.     * @author 活力橙 
  7.     * @creation 2015-6-26 
  8.     */  
  9.     public static String SpellUnit(String unit,String id){  
  10.           
  11.         StringBuffer parseText=new StringBuffer();  
  12.         id=id.replace("@+id/""");  
  13.         parseText.append("@InjectView(R.id."+id+")"+"\r\n");  
  14.         parseText.append(unit+" "+id+";");  
  15.         return parseText.toString();  
  16.           
  17.     }  
  18.   
  19. }  


解析也有了,拼接也有了,剩下的要做什么呢?

当然就是把拼接好的字符串复制到黏贴板上了,还是个工具类。

ClipBoard.java

[java]  view plain copy
  1. package util;  
  2. import java.awt.Toolkit;  
  3. import java.awt.datatransfer.Clipboard;    
  4. import java.awt.datatransfer.Transferable;    
  5. import java.awt.datatransfer.StringSelection;    
  6. import java.awt.event.ActionEvent;  
  7. public class ClipBoard {  
  8.     /** 
  9.     * @author 活力橙 
  10.     * @creation 2015-6-26 
  11.     */  
  12.       
  13.     public static void actionPerformed(String text) {     
  14.     Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); //获得系统粘贴板     
  15.     StringSelection textInfoSelected = new StringSelection(text); //建立一个粘贴板内容实例.     
  16.     clipboard.setContents(textInfoSelected, null); //将textInfoSelected加入到粘贴板中;     
  17.     }     
  18. }  


OK,万事俱备,剩下的就是要写bat文件和调用的Main方法入口了。

也非常简单

CreateLayooutXml.java

[html]  view plain copy
  1. package util;  
  2.   
  3. import java.awt.Toolkit;  
  4. import java.awt.datatransfer.StringSelection;  
  5. import java.util.Map;  
  6.   
  7. public class CreateLayooutXml {  
  8.   
  9.     /**  
  10.     * @author 活力橙  
  11.     * @creation 2015-6-26  
  12.     */  
  13.       
  14.     public static void main(String[] args) {  
  15.           
  16.         // TODO Auto-generated method stub  
  17.         Map<String,String> map=LayoutUtil.ParseLayout(args[0]);  
  18.         String parseText="";  
  19.         for(Map.Entry<String, String> entry:map.entrySet()){      
  20.              parseText += SpellUtil.SpellUnit(entry.getValue(),entry.getKey())+"\n";  
  21.         }     
  22.           
  23.         System.out.println(parseText);  
  24.           
  25.         ClipBoard.actionPerformed(parseText);  
  26.           
  27.   
  28.       
  29.     }  
  30.   
  31. }  



 到此为止,Java方面要做的事情已经做完了,注意:
[java]  view plain copy
  1. LayoutUtil.ParseLayout(args[0]);  

这句话的意思就是编译的时候,这参数要从批处理文件中传入,传入的内容其实就是布局文件的绝对路径。

剩下的事情就是要写一个批处理文件,然后可以传入文件路径,可以执行CreateLayoutXml.java中的Main函数就可以了。

ButterKnife_Jia.bat

[html]  view plain copy
  1. @echo off  
  2.   
  3. echo path:%~dp0  
  4.   
  5. set base=%~dp0  
  6.   
  7. set class=%base%\bin  
  8. set libs=%base%\lib  
  9.   
  10. set class_path=%class%;%libs%\dom4j-1.6.1.jar;  
  11. @set input=  
  12. @set /p input=拖入布局文件并回车:  
  13.   
  14. java -classpath %class_path% util.CreateLayooutXml %input%  
  15. echo %该布局的初始化内容已复制到黏贴板  
  16. @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.youkuaiyun.com/detail/jasoncol_521/8841831


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值