Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 布局 View初始化代碼自動生成

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

編輯:關於Android編程

在android開發過程中,界面布局是及其重要的,但同時也是復雜。有的時候我們急於實際運行查看布局效果。但是android的編譯速度我實在不想吐槽啥,尤其在布局越來越復雜,項目越來越大,資源文件越來越多的情況下。

尤其是是android的view的初始化,findViewbyId 完全是體力活,我們完全可以根據布局文件自動生成View的初始化代碼。

首先聲明:

1.這是及其容易做到的,實用性性一般,但是在復雜布局和首次寫初始化View代碼的時候及其好用。

2.只能生成有id標簽的view的初始化代碼。

思路

其實很簡單,就是解析layout 布局文件,把有id屬性的標簽的一些信息(標簽類型,id名稱等)存起來,然後根據這些信息生成固定的代碼。

實現

直接上代碼,首先是對layout文件的解析,把解析出來的信息放在一個list中

public class SaxHander extends DefaultHandler {
	private List map = new ArrayList();

	
	@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 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 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]));
		}	
		
	}

}


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved