編輯:關於Android編程
在android開發過程中,界面布局是及其重要的,但同時也是復雜。有的時候我們急於實際運行查看布局效果。但是android的編譯速度我實在不想吐槽啥,尤其在布局越來越復雜,項目越來越大,資源文件越來越多的情況下。
尤其是是android的view的初始化,findViewbyId 完全是體力活,我們完全可以根據布局文件自動生成View的初始化代碼。
首先聲明:
1.這是及其容易做到的,實用性性一般,但是在復雜布局和首次寫初始化View代碼的時候及其好用。
2.只能生成有id標簽的view的初始化代碼。
其實很簡單,就是解析layout 布局文件,把有id屬性的標簽的一些信息(標簽類型,id名稱等)存起來,然後根據這些信息生成固定的代碼。
直接上代碼,首先是對layout文件的解析,把解析出來的信息放在一個list中
public class SaxHander extends DefaultHandler { private Listmap = 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; } Listres = 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機器上運行,對UI的適用性造成了額外的開銷,不過限定符的出現,很方便的解決了這個問題。通過創建限定符相關的文件夾來解決資源的加載。限
這裡講一下React Native中的一個組件——ActivityIndicator,這是一個加載指示器,俗稱菊花,很常見的,效果如下所示:imp
app中肯定是少不了與用戶交互的各種dialog,下面給大家介紹幾種提示框的提示。一般創建一個對話框需要經過以下幾步: 1、創建AlertDialog.Builder對
由於項目需要,我們需要一個可以橫向滾動的,又可以豎向滾動的 表格。而且又要考慮大數據量(行)的展示視圖。經過幾天的研究終於搞定,做了一個演示。貼圖如下: &nb