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
- Android根据布局文件生成activity类
- Android Studio 自动根据布局生成Activity
- Android Studio插件-自动根据布局生成Activity等代码(插件代码开源)
- Android Studio插件-自动根据布局生成Activity等代码(开源)
- Android Studio插件-自动根据布局生成Activity等代码(插件代码开源)
- Android 根据View(布局) 生成图片(Bitmap)
- [Android实例] Android Studio插件-自动根据布局生成Activity等代码1.4 (开源)(申明:来源于网络)
- Android根据布局文件动态添加控件
- Android NDK 生成.h文件无法访问Activity的类文件
- 【Android】Android Layout Binder——根据layout布局文件自动生成findViewById的java代码的神器
- 关于android文件布局在R类不能生成
- Android-Activity程序动态的生成表格布局管理器
- Android-Activity程序动态的生成表格布局管理器
- android根据apk文件得到package名和activity名
- Android 生成 c/c++ 头文件 错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件
- 根据xsd文件生成java类
- android Activity.this.getLayoutInflater()::动态加载布局文件,实现弹窗效
- Android Activity相对布局
- 第14周项目1-(2)验证分块查找算法
- spring 的面试题
- hibernate多对多之中间表有多个字段
- 一次皆大欢喜的加薪
- CDH5.1使用CDH Manager安装
- Android根据布局文件生成activity类
- 关于权限控制的讨论
- private, public, protected 访问标号的访问范围之JAVA篇
- (二十一)某些定义(也是考题):
- 发布项目,Upload AppStore解决ITMS-90096问题
- SparkSQL样例
- ios面试题(2)
- nodeJs+jquery实现聊天插入表情功能
- leetcode 283 Move Zeroes C++