# android-layout2code-builder **Repository Path**: treejames/android-layout2code-builder ## Basic Information - **Project Name**: android-layout2code-builder - **Description**: 通过freemaker将写好的android layout文件生成对应的java代码,省去不少机械操作。 该项目所用的模板是以自己的开发习惯为范例所写,仅提供一种思路,请根据实际情况自行定义。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: http://dzlg.sinaapp.com/?p=235 - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 6 - **Created**: 2014-11-17 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README Android Layout2Code Builder =================================== 通过freemaker将写好的android layout文件生成对应的java代码,主要生成Activity和 Fragment两类,这样可以减少很多开发中的机械操作,再也不用一一对应的把layout文件中View标签copy到java代码中了。 更新 build-0.3.0 ----------------------------------- ### New Done 1.FragmentActivity的View标签生成 2.fragment标签生成 3.完善测试实例 ### Unfinished ### Next 1.剥离动态模版构建架构独立成为新项目 2.基于所剥离的重新实现该项目 项目说明 ----------------------------------- 通过读取指定路径下的layout文件,根据layout文件命名规则生成对应Activity或者Fragment的Java类,并将布局文件中对应的 View标签生成该Java类的属性对象,且根据View标签的id属性生成该属性的变量名。 该项目下的 layout文件的命名规则示例如下: ### `hello_word_activity.xml` 该布局文件则会生成一个`HelloWordActivity.java`文件,且继承于模版所指定的某个`Activity`类(如指定了接口也会一并生成),并对应生成`OnCreate`方法 ### `main_fragment.xml` 对应该布局文件则会生成`MainFragment.java`文件,并继承于模版所指定的某个`Fragment`(如指定了接口也会一并生成),并对应生成`onCreate`、`onCreateView`、`onViewCreated`方法 java文件中会根据配置生成对应的一些package引入和基础的代码,接下来则根据layout文件中的标签属性生成对应的Java属性对象,规则如下: ### `` 对应生成如下java代码: > `import android.widget.TextView ;`//这段引入代码是在文件头部分,这里只是为了简便,就没加上类名等代码 > `@InjectView(R.id.hello_word_text)` > `private TextView mHelloWordText;` 每个layout文件中,只有写了 `android:id=”@id+/”`这一属性的标签才会在对应java类中声明对应变量 对象的变量名的生成规则也可自行定义,详情参考代码中`NameGenerater`这一节接口类。 直观代码例子请参考Test类,demo如下 ### 示例 public static void main( String[] args ) throws ResourcesException { MyNameGenerater defaultNameGenerater = new MyNameGenerater (); ClassTemplate activityTemplate = ClassTemplate.Builder.build ( LayoutType.ACTIVITY, true, defaultNameGenerater ).extendsClass ( Activity.class ) .implementsInterface ( View.OnClickListener.class ).commit (); ClassTemplate fragmentTemplate = ClassTemplate.Builder.build ( LayoutType.FRAGMENT, true, defaultNameGenerater ).extendsClass ( Fragment.class ) .implementsInterface ( View.OnClickListener.class ).commit (); CodeGenerater codeBuilder = new CodeGenerater (); codeBuilder.generate ( "E:\\WorkSpace\\ForAndroid\\TestAndroid\\", activityTemplate, fragmentTemplate ); } private static class MyNameGenerater extends DefaultNameGenerater { @Override public String generateHostPackage() { return "com.example.testandroid"; } } 调用以上方法时,请将目标项目添加到该项目的build path下,以便于构建模版时可以调用目标项目的自定义类。如果所调用的类引用了除android.jar、android-support-v4.jar、freemaker.jar等以外的依赖包,请将对应引用包也添加进该项目的build path,避免代码生成异常 ### DefaultNameGenerater 实现于NameGenerater,用于类名、方法名、变量名、包路径等命名规则生成,建议根据自身需求实现NameGenerater这一接口,而不是采用DefaultNameGenerater来完成生成 ### ClassTemplate 主要的模版对象,用于构建freemaker的模版内容,通过ClassTemplate.Builder来实例化并构筑内容,包含了要继承的对象,实现的接口(所有需要实现的接口类都会自动生成其接口方法) ### CodeGenerater 将layout文件生成对应Java文件的核心类