android 布局 View初始化代碼自動產生

來源:互聯網
上載者:User

標籤:android   布局   代碼產生   view   初始化   

在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>();@Overridepublic void startDocument() throws SAXException {super.startDocument();map.clear();}@Overridepublic 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 blocke.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]));}}}


android 布局 View初始化代碼自動產生

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.