通过freemaker将写好的android layout文件生成对应的java代码,主要生成Activity和 Fragment两类,这样可以减少很多开发中的机械操作,再也不用一一对应的把layout文件中View标签copy到java代码中了。
1.FragmentActivity的View标签生成
2.fragment标签生成
3.完善测试实例
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属性对象,规则如下:
<TextView andorid:id=”@id+/hello_word_text”/>
对应生成如下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,避免代码生成异常
实现于NameGenerater,用于类名、方法名、变量名、包路径等命名规则生成,建议根据自身需求实现NameGenerater这一接口,而不是采用DefaultNameGenerater来完成生成
主要的模版对象,用于构建freemaker的模版内容,通过ClassTemplate.Builder来实例化并构筑内容,包含了要继承的对象,实现的接口(所有需要实现的接口类都会自动生成其接口方法)
将layout文件生成对应Java文件的核心类
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型