当前位置: 移动技术网 > IT编程>移动开发>Android > Android中实现自动生成布局View的初始化代码方法

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

孙娜恩真面目,黑糖事务所,蘑菇人民机

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网