在android开发过程中,界面布局是及其重要的,但同时也是复杂。有的时候我们急于实际运行查看布局效果。但是android的编译速度我实在不想吐槽啥,尤其在布局越来越复杂,项目越来越大,资源文件越来越多的情况下。
尤其是是android的view的初始化,findViewbyId 完全是体力活,我们完全可以根据布局文件自动生成View的初始化代码。
首先声明:
1.这是及其容易做到的,实用性性一般,但是在复杂布局和首次写初始化View代码的时候及其好用。
2.只能生成有id标签的view的初始化代码。
思路
其实很简单,就是解析layout 布局文件,把有id属性的标签的一些信息(标签类型,id名称等)存起来,然后根据这些信息生成固定的代码。
实现
直接上代码,首先是对layout文件的解析,把解析出来的信息放在一个list中
public class SaxHander extends DefaultHandler { private List<IdNamePair> map = new ArrayList<IdNamePair>(); @Override public void startDocument() throws SAXException { super.startDocument(); map.clear(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); // System.out.println("-------------------------------------"); String tempid = attributes.getValue("android:id"); String id = null; if (tempid != null) { String[] ss = tempid.split("/"); if (ss != null && ss.length == 2) { id = ss[1]; } } if (id != null) { map.add(new IdNamePair(id, qName)); } // System.out.println(id); // System.out.println(qName); } public List<IdNamePair> getRes() { return map; } }
public class IdNamePair { private String id; private String name; /** * @param id * @param name */ public IdNamePair(String id, String name) { super(); this.id = id; this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
然后一点点的拼接代码
public class ViewCodeUtil { static SAXParserFactory saxfac = SAXParserFactory.newInstance(); static SaxHander mySax = new SaxHander(); public static String getCode(String resFileName){ File f = new File(resFileName); if (!f.exists()) { return null; } try { saxfac.newSAXParser().parse(f,mySax); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } List<IdNamePair> res = mySax.getRes(); StringBuilder sb = new StringBuilder(); StringBuilder sb1 = new StringBuilder(); sb.append("//---------- 开始定义域--------------\n"); sb1.append("//----------开始initView方法------------------\n"); sb1.append("public void initView() { \n"); for (IdNamePair idNamePair : res) { sb.append(" private "+idNamePair.getName()+" "+ idNamePair.getId()+idNamePair.getName()+";\n"); sb1.append(" "+idNamePair.getId()+idNamePair.getName()+" = ("+idNamePair.getName()+")findViewById(R.id."+idNamePair.getId()+");\n"); } sb1.append("}\n"); // System.out.println(sb.toString()); // System.out.println(sb1.toString()); return sb.append(sb1.toString()).toString(); }
最后是测试类main方法。
public class Test { private static final String[] layoutFiles ={"./res/g_ruler.xml","./res/report.xml"}; public static void main(String[] args) { if (args!=null) { for (int i = 0; i < args.length; i++) { System.out.println(""); System.out.println("---------"+args[i]+"----------"); System.out.println(ViewCodeUtil.getCode(args[i])); } } for (int i = 0; i < layoutFiles.length; i++) { System.out.println(""); System.out.println("//---------"+layoutFiles[i]+"----------"); System.out.println(ViewCodeUtil.getCode(layoutFiles[i])); } } }
时间: 2024-10-11 08:35:01