編輯:關於Android編程
在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("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]));
}
}
}
從這篇開始,我將延續androidGraphics系列文章把圖片相關的知識給大家講完,這一篇先稍微進階一下,給大家把《Android Graphics(二):路徑及文字》
1.概述與應用場景RatingBar(評分條)他是progressbar和seekbar的擴展,用星型來表示評分等級,同時它有兩種風格,一種可與用戶交互,另一種只是用於指
一、ANR異常(Application Not Responding)應用程序無響應ANR定義:一個流暢的合理的應用程序中不能出現anr,而讓用戶每次都要處理這個對話框。
前言相信大家都知道Android滾動控件的實現方式有很多, 使用RecyclerView也比較簡單. 做了一個簡單的年齡滾動控件, 讓我們來看看RecyclerView的