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

在android开发过程中,界面布局是及其重要的,但同时也是复杂。有的时候我们急于实际运行查看布局效果。但是android的编译速度我实在不想吐槽啥,尤其在布局越来越复杂,项目越来越大,资源文件越来越多的情况下。

尤其是是android的view的初始化,findViewbyId 完全是体力活,我们完全可以根据布局文件自动生成View的初始化代码。

首先声明:

1.这是及其容易做到的,实用性性一般,但是在复杂布局和首次写初始化View代码的时候及其好用。

2.只能生成有id标签的view的初始化代码。

思路

其实很简单,就是解析layout 布局文件,把有id属性的标签的一些信息(标签类型,id名称等)存起来,然后根据这些信息生成固定的代码。

实现

直接上代码,首先是对layout文件的解析,把解析出来的信息放在一个list中

public class SaxHander extends DefaultHandler {

private List map = 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("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;

}

List 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]));

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值