源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Android中实现自动生成布局View的初始化代码方法

  • 时间:2021-04-28 21:51 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Android中实现自动生成布局View的初始化代码方法
在android开发过程中,界面布局是及其重要的,但同时也是复杂。有的时候我们急于实际运行查看布局效果。但是android的编译速度我实在不想吐槽啥,尤其在布局越来越复杂,项目越来越大,资源文件越来越多的情况下。 尤其是是android的view的初始化,findViewbyId 完全是体力活,我们完全可以根据布局文件自动生成View的初始化代码。 首先声明:   1.这是及其容易做到的,实用性性一般,但是在复杂布局和首次写初始化View代码的时候及其好用。 2.只能生成有id标签的view的初始化代码。 [b]思路[/b] 其实很简单,就是解析layout 布局文件,把有id属性的标签的一些信息(标签类型,id名称等)存起来,然后根据这些信息生成固定的代码。 [b]实现[/b] 直接上代码,首先是对layout文件的解析,把解析出来的信息放在一个list中
[u]复制代码[/u] 代码如下:
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;       } }
[u]复制代码[/u] 代码如下:
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;     }      }
然后一点点的拼接代码
[u]复制代码[/u] 代码如下:
 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方法。
[u]复制代码[/u] 代码如下:
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]));         }               }   }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部