广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-04-16 10:57:09 次阅读 稿源:互联网
    广告

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

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告