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

时间: 2024-09-11 11:54:19

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

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

在android开发过程中,界面布局是及其重要的,但同时也是复杂.有的时候我们急于实际运行查看布局效果.但是android的编译速度我实在不想吐槽啥,尤其在布局越来越复杂,项目越来越大,资源文件越来越多的情况下. 尤其是是android的view的初始化,findViewbyId 完全是体力活,我们完全可以根据布局文件自动生成View的初始化代码. 首先声明:   1.这是及其容易做到的,实用性性一般,但是在复杂布局和首次写初始化View代码的时候及其好用. 2.只能生成有id标签的view的初

Android 中RecyclerView多种item布局的写法(头布局+脚布局)

RecyclerView多个item布局的写法(头布局+脚布局) 上图 github 下载源码 Initial commit第一次提交的代码,为本文内容 以下的为主要代码,看注释即可,比较简单 MainActivity 含上拉加载更多 package com.anew.recyclerviewall; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivi

探究Android中ListView复用导致布局错乱的解决方案

首先来说一下具体的需求是什么样的: 需求如图所示,这里面有ABCD四个选项的题目,当点击A选项,如果A是正确的答案,则变成对勾的图案,如果是错误答案,则变成错误的图案,这里当时在写的时候觉得很简单,只要是在点击的时候判断我点击的选项与正确答案是否一样,是一样就将图片换成正确的样式,如果不一样就换成错误的样式,于是我便写了下面的代码(只贴出了核心Adapter中的代码) package com.fizzer.anbangproject_dahuo_test.Adapter; import andr

Android Studio中导入JNI生成的.so库的实现方法

Android Studio中导入JNI生成的.so库的实现方法 由于在原来的ADT的Eclipse环境中,用ndk_build工具生成了相应的各个.so库文件之后,eclipse工具就会自动把这些库导入到apk中.而Android Studio目前为止(0.86版本)还无法做到那么自动,但是我们可以通过以下方式进行. 首先在Android Studio工程的app目录下创建整个jni目录,jni目录里写Android.mk.Application.mk以及各类C/C++和汇编源文件.然后跟原来

android中圆角图像生成方法

  这篇文章主要介绍了android中圆角图像生成方法,涉及Android处理圆角图像的技巧,需要的朋友可以参考下 本文实例讲述了android中圆角图像生成方法.分享给大家供大家参考.具体分析如下: 在android开发中为了美观,常常要求ImageView中显示出圆角图像的效果,这个如何实现? 这里总结了网上的最优方法:将图像处理成圆角,然后在加载给ImageView显示,代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public Bitmap

Word中怎么自动生成目录

  Word中不仅能自己插入目录,还可设置自动生成目录,相信很多的朋友跟我一样不知道吧!没关系,小编这里总结了一些高手介绍的设置技巧,经常写书或者是写论文的朋友,可以熟知一下. Word 优点:用Word根据文章的章节自动生成目录不但快捷,而且阅读查找内容时也很方便,只是按住Ctrl点击目录中的某一章节就会直接跳转到该页,更重要的是便于今后修改,因为写完的文章难免多次修改,增加或删减内容.倘若用手工给目录标页,中间内容一改,后面页码全要改是一件很让人头痛的事情.应该自动生成的目录,你可以任意修改

android ndk adt自动生成头文件问题。

问题描述 android ndk adt自动生成头文件问题. android ndk adt自动生成头文件时候,在项目src目录下打开cmd.运行javah加adt复制的方法包名,为什么提示找不到com.zhhd.simplejni.MainActivity的类文件.在bin/classes也不行.怎么办,卡在这么个地方太闹心了 解决方案 javah -classpath . -jni 这里点表示当前路径.

android中我想对实现View放大。放大以后里面的组件还有点击事件

问题描述 android中我想对实现View放大.放大以后里面的组件还有点击事件 我想对实现View放大.放大以后里面的组件还有点击事件.不是道能否实现.这个问题一直困扰我很久了.谢谢.

response-asp.net mvc4 在过滤器中如何获取生成的view的html文本

问题描述 asp.net mvc4 在过滤器中如何获取生成的view的html文本 问题如下: 我想在过滤器中截取一个Action返回View时生成的页面内容 的文本, 我在 OnResultExecuted(ResultExecutedContext filterContext) 中获取到了 filterContext.HttpContext.Response: 但是如何获取生成的HTML内容呢,这里好像是没有获取到 示例: public override void OnResultExecu