Android根据布局文件生成activity类

来源:互联网 发布:东芝181usb端口驱动 编辑:程序博客网 时间:2024/05/17 02:46

貌似终于回到到android上了!!之前在没事做但是又敲不了代码的情况下,我想到一个idea,但是因为顺序及时间问题,没能实现,今天终于实现了一下,虽然并没多大用处,但是用起来还是棒棒哒!!

idea如下:
因为之前做webservice的时候,利用自己定义的action类生成了servlet类以及自动注册servlet,所以前端时间想到,那我不是可以利用android的布局文件自动创建activity类?顺便把findviewbyid这步也自动写上,那岂不是。。<( ̄︶ ̄)>
哈哈哈~~已经实现,虽然现在比较简陋,但是慢慢改进应该会更好的!!
实现之后的好处就是::::
做项目直接写布局文件,写好之后,一个运行,哈哈,不用去鼠标新建了,只要轻轻点几下,activity全出来,也不用担心注册了,简直减少不少劳动力啊!

总结下实现:
基本思路:
1.获取布局文件中带id的控件
2.新建代码
3.创建java文件
4.在AndroidManifest.xml中注册

1.获取布局文件中带id的控件

主要思路:使用org.w3c.dom来操作XML文件,然后迭代获取带id的控件 

关键代码:

private void findID(Node node) {    //排除无用的节点<这个节点貌似是隐藏在xml中的,总是出现>    if ("#text".equals(node.getNodeName())) {        return;    }    //获取节点中的android:id节点<节点接口中将属性也当做一个节点>    Node n = node.getAttributes().getNamedItem("android:id");    if (n != null) {        //获取id节点的值,去除多余的东西,获取到控件id        String id = n.getNodeValue().replace("android:id=", "");        id = id.replace("\"", "");        if (!"".equals(id)) {            String m_id = id.replace("@+id/", "");            if (m_id.equals(id)) {                m_id = id.replace("@id/", "");            }            //获取控件类型<其实就是node的标签名>            String m_type = node.getNodeName();            //生成ViewIdPair并放入ViewPairList            ViewIdPair hm = new ViewIdPair(m_type, m_id);            ViewPairList.add(hm);        }    }    //迭代子节点    NodeList nl = node.getChildNodes();    for (int i = 0; i < nl.getLength(); i++) {        findID(nl.item(i));    }}

2.新建代码

主要思路:给一个代码实例,然后替换掉其中一些的代码块。这里根据会改变的代码我新建了一个代码类,主要保存包名,类名之类的。

关键代码:

/** * @作者:唐晓 * @功能:自动生成activity的实体类 */public class ActivityCode {    private String PackagePath;//包路径    private String ImportCode;//import语句代码块    private String ClassName;//类名    private String ExtendsClass;//继承至的类    private String DefineViewCode;//声明View的代码块    private String LayoutName;//布局文件的名称    private String FindViewCode;//findviewbyid语句    public ActivityCode() {    }    public ActivityCode(String packagePath, String importCode,            String className, String extendsClass, String defineViewCode,            String layoutName, String findViewCode) {        super();        PackagePath = packagePath;        ImportCode = importCode;        ClassName = className;        ExtendsClass = extendsClass;        DefineViewCode = defineViewCode;        LayoutName = layoutName;        FindViewCode = findViewCode;    }    public String toCode(String BasicCode){        BasicCode = BasicCode.replace("PackagePath", PackagePath);        BasicCode = BasicCode.replace("ImportCode", ImportCode);        BasicCode = BasicCode.replace("ClassName", ClassName);        BasicCode = BasicCode.replace("ExtendsClass", ExtendsClass);        BasicCode = BasicCode.replace("DefineViewCode", DefineViewCode);        BasicCode = BasicCode.replace("LayoutName", LayoutName);        BasicCode = BasicCode.replace("FindViewCode", FindViewCode);        return BasicCode;    }    public String getPackagePath() {        return PackagePath;    }    public void setPackagePath(String packagePath) {        PackagePath = packagePath;    }    public String getImportCode() {        return ImportCode;    }    public void setImportCode(String importCode) {        ImportCode = importCode;    }    public String getClassName() {        return ClassName;    }    public void setClassName(String className) {        ClassName = className;    }    public String getExtendsClass() {        return ExtendsClass;    }    public void setExtendsClass(String extendsClass) {        ExtendsClass = extendsClass;    }    public String getDefineViewCode() {        return DefineViewCode;    }    public void setDefineViewCode(String defineViewCode) {        DefineViewCode = defineViewCode;    }    public String getLayoutName() {        return LayoutName;    }    public void setLayoutName(String layoutName) {        LayoutName = layoutName;    }    public String getFindViewCode() {        return FindViewCode;    }    public void setFindViewCode(String findViewCode) {        FindViewCode = findViewCode;    }}
package com.cxw.auto;import java.io.File;import java.util.List;/** * @作者:唐晓 * @功能: *//** * @作者:唐晓 * @功能: */public class CodeMaker {    /**     * @作者:唐晓     * @功能:生成定义控件代码     * @param infos     *            xml中的view信息     * @return void     * @时间:2015-12-2     */    public String DefineViewCode(List<ViewIdPair> infos) {        StringBuffer codeSb = new StringBuffer();        for (int i = 0; i < infos.size(); i++) {            codeSb.append("private ");            codeSb.append(infos.get(i).getViewType().split("\\.")[infos.get(i).getViewType().split("\\.").length - 1] + " " + infos.get(i).getViewId());            codeSb.append(";");        }        return codeSb.toString();    }    /**     * @作者:唐晓     * @功能:根据布局文件名生成class的名字     * @param fileName     * @return     * @return String     * @时间:2015-12-2     */    public String ClassName(String fileName) {        fileName = fileName.replace(".xml", "");        String[] strings = fileName.split("_");        StringBuffer nameSB = new StringBuffer();        for (int i = 0; i < strings.length; i++) {            if (strings[i].equals("activity")) {                continue;            }            nameSB.append(strings[i]);        }        nameSB.append("Activity");        return nameSB.toString();    }    /**     * @作者:唐晓     * @功能:继承类的代码块     * @return     * @return String     * @时间:2015-12-2     */    public String ExtendsClass() {        return "ActionBarActivity";    }    /**     * @作者:唐晓     * @功能:查找控件的代码块     * @param infos     * @return     * @return String     * @时间:2015-12-2     */    public String FindViewCode(List<ViewIdPair> infos) {        StringBuffer CodeSB = new StringBuffer();        for (int i = 0; i < infos.size(); i++) {            String viewType = infos.get(i).getViewType().split("\\.")[infos.get(i).getViewType().split("\\.").length - 1];            CodeSB.append(viewType + "  ");            CodeSB.append(infos.get(i).getViewId());// 名称需要规则,这里暂时用id            CodeSB.append("= ");            CodeSB.append("(" + viewType + ")");            CodeSB.append("findViewById(R.id." + infos.get(i).getViewId() + ");");        }        return CodeSB.toString();    }    /**     * @作者:唐晓     * @功能:import语句代码生成     * @param infos     * @return     * @return String     * @时间:2015-12-2     */    public String ImportCode(List<ViewIdPair> infos) {        List<ViewIdPair> infoList = infos;        // 1.排除基本控件        for (int i = infoList.size() - 1; i >= 0; i--) {            if (!infos.get(i).getViewType().contains(".")) {                infos.remove(i);            }        }        // 2.去掉相同的项        for (int i = infoList.size() - 1; i >= 0; i--) {            for (int j = infoList.size() - 2; j >= 0; j--) {                if (infoList.get(i).getViewType().equals(infoList.get(j).getViewType())) {                    infoList.remove(j);                }            }        }        StringBuffer CodeSB = new StringBuffer();        // 3.生成代码        for (int i = infoList.size() - 1; i >= 0; i--) {            CodeSB.append("import ");            CodeSB.append(infoList.get(i).getViewType());            CodeSB.append(";");        }        return CodeSB.toString();    }    /**     * @作者:唐晓     * @功能:设置layoutname的string     * @param file     * @return     * @return String     * @时间:2015-12-2     */    public String LayoutName(File file) {        return file.getName().replace(".xml", "");    }    /**     * @作者:唐晓     * @功能:包路径     * @return     * @return String     * @时间:2015-12-2     */    public String PackagePath() {        return "com.example.autoactivity";    }}
/**     * @作者:唐晓     * @功能:获取文件内容字符串     * @param file     *            文件     * @return     * @return String     * @时间:2015-12-1     */    public String getFileString(File file) {        StringBuffer sb = new StringBuffer();        try {            FileReader fileReader = new FileReader(file);            BufferedReader bufferedReader = new BufferedReader(fileReader);            String line;            while ((line = bufferedReader.readLine()) != null) {                sb.append(line);            }            bufferedReader.close();            fileReader.close();        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return sb.toString();    }
package PackagePath;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.widget.*;ImportCodepublic class ClassName extends ExtendsClass {    DefineViewCode    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.LayoutName);        FindViewCode    }}

3.创建java文件
思路就是不用客气直接创建!
关键代码:

/**     * @作者:唐晓     * @功能:向文件中写入数据     * @param text     *            数据     * @param file     *            文件     * @return void     * @时间:2015-12-1     */    @SuppressLint("NewApi")    public void writeIntoFile(String text, File file) {        if (!file.exists()) {            return;        }        file.setWritable(true);        FileWriter fileWriter;        try {            fileWriter = new FileWriter(file);            fileWriter.append(text);// 想文件中写入内容            fileWriter.flush();            fileWriter.close();        } catch (IOException e) {            e.printStackTrace();        }    }

4.在AndroidManifest.xml中注册
基本思路:读取xml,判断该activity是不是已经注册了,没注册给注册上,就酱!
关键代码:

/**     * @作者:唐晓     * @功能: 在application标签中注册activity     * @param androidName activity类的位置     * @return void     * @时间:2015-12-2     */    public void registerActivity(String androidName) {        try {            //获取根节点            Element element = getRootElement();            //获取根节点的子节点            NodeList nodeList = element.getChildNodes();            //遍历子节点            for (int i = 0; i < nodeList.getLength(); i++) {                Node node = nodeList.item(i);                //去除多余标签                if ("#text".equals(node.getNodeName())) {                    continue;                }                //判断是不是application标签<我们要操作的就是application标签>                if ("application".equals(node.getNodeName())) {                    NodeList activityNodes = node.getChildNodes();                    //是否注册的标示                    boolean isRegister = false;                    //遍历application子标签,检测是否已经注册过,如果注册过就不进行注册                    for (int j = 0; j < activityNodes.getLength(); j++) {                        if (activityNodes.item(j).getNodeName().equals("activity")) {                            if (((Element) activityNodes.item(j)).getAttribute("android:name").equals(androidName)) {                                isRegister = false;                                break;                            } else {                                isRegister = true;                            }                        }                    }                    if (isRegister) {                        //向xml中写入要注册的activity标签                        nodeList.item(i).appendChild(newElementWithSingleAttr("activity", "android:name", androidName));                        ((XmlDocument) dt).write(new FileOutputStream("AndroidManifest.xml"));                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * @作者:唐晓     * @功能:实例化一个标签 , 该标签带有一个属性     * @param name 标签名     * @param AttrName 属性名     * @param AttrValue 属性内容     * @return      * @return Element     * @时间:2015-12-2     */    public Element newElementWithSingleAttr(String name, String AttrName, String AttrValue) {        Element element = dt.createElement(name);        element.setAttribute(AttrName, AttrValue);        return element;    }

最后代码demo:
http://download.csdn.net/detail/q315179743/9321075

其中ACase是使用的方法

0 0
原创粉丝点击