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

 更新时间:2014年10月10日 09:57:18   投稿:junjie  
这篇文章主要介绍了Android中实现自动生成布局View的初始化代码方法,本文使用解析layout 布局文件的方法实现需求,需要的朋友可以参考下

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

相关文章

  • Android使用shape使组件呈现出特殊效果的方法

    Android使用shape使组件呈现出特殊效果的方法

    这篇文章主要介绍了Android使用shape使组件呈现出特殊效果的方法,结合实例形式分析了Android中shape文件相关属性、功能及使用方法,需要的朋友可以参考下
    2017-07-07
  • Android NDK开发详细介绍

    Android NDK开发详细介绍

    本文主要介绍Android NDK开发,这里详细整理了相关资料并介绍 NDK的知识和开发流程及简单示例代码,帮助大家学习,有需要的小伙伴可以参考下
    2016-09-09
  • Android如何自定义视图属性

    Android如何自定义视图属性

    这篇文章主要为大家介绍了Android如何自定义视图属性,三个步骤自定义视图属性,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android的EditText字数检测和限制解决办法

    Android的EditText字数检测和限制解决办法

    这篇文章主要介绍了Android的EditText字数检测和限制解决办法的相关资料,需要的朋友可以参考下
    2017-03-03
  • Android实现QQ抢红包插件

    Android实现QQ抢红包插件

    这篇文章主要介绍了Android实现QQ抢红包插件,可以支持抢QQ拼手气红包,普通红包,口令红包,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • Android实现简易版弹钢琴效果

    Android实现简易版弹钢琴效果

    这篇文章主要为大家详细介绍了Android实现简易版弹钢琴效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Android组件之间交互核心Intent用法分析

    Android组件之间交互核心Intent用法分析

    这篇文章主要介绍了Android组件之间交互核心Intent用法,结合实例形式分析了Intent实现组件之间交互的步骤与相关技巧,需要的朋友可以参考下
    2016-06-06
  • Android使用Matrix旋转图片模拟碟片加载过程

    Android使用Matrix旋转图片模拟碟片加载过程

    这篇文章主要为大家详细介绍了Android使用Matrix旋转图片模拟碟片加载过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Android如何获取屏幕、状态栏及标题栏的高度详解

    Android如何获取屏幕、状态栏及标题栏的高度详解

    在日常开发中,经常会遇到获取屏幕高度、状态栏高度等需求,所以下面这篇文章就给大家总结介绍了关于Android如何获取屏幕、状态栏及标题栏高度的相关资料,文中通过示例代码介绍的非常详细,需要的朋友们可以参考下。
    2017-10-10
  • Android编程之界面实现全屏显示的方法(2种方法)

    Android编程之界面实现全屏显示的方法(2种方法)

    这篇文章主要介绍了Android编程之界面实现全屏显示的方法,结合实例分析了Java代码中设置与Manifest文件设置2种实现方法,需要的朋友可以参考下
    2016-01-01

最新评论