Android中实现自动生成布局View的初始化代码方法
程序员文章站
2022-04-30 22:55:21
在android开发过程中,界面布局是及其重要的,但同时也是复杂。有的时候我们急于实际运行查看布局效果。但是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]));
}
}
}