简介
Android Studio Template 依靠 FreeMarker 引擎, 将事先定义好的模板文件生成我们所需的 class 文件, layout 文件等等, 可以极大减少样板式代码的编写.
模板位置, Windows 的路径在 /plugins/android/lib/templates/,Mac 下是 Android Studio.app/Contents/plugins/android/lib/templates/, 将自己写好的模板文件拷贝到此次即可在项目中使用, 在 file->new->activity 中快速生成模板文件.
模板编写
主要有以下几个文件, 变量名用 ${var} 表示
Activity.java.ftl 中写 activity 相关代码
- package ${packageName};
- public class ${activityName} extends BaseActivity {
- @Bind(R.id.public_tv_title_text)
- TextView publicTvTitleText;
- @Bind(R.id.public_tv_title_save)
- TextView publicTvTitleSave;
- @Override
- public int getLayoutId() {
- return R.layout.${layoutName};
- }
- @Override
- public void init() {
- ButterKnife.bind(this);
- SystemBarTintUtil.INSTANCE.setSystenBarTint(mActivity, findView(R.id.${layoutName}_root), true);
- }
- @Override
- public void initEvent() {
- }
- @Override
- public void initData() {
- publicTvTitleText.setText("${title}");
- publicTvTitleSave.setText(" ");
- publicTvTitleSave.setVisibility(View.GONE);
- publicTvTitleSave.setTextColor(Color.parseColor("#FF333333"));
- }
- @Override
- protected void onResume() {
- super.onResume();
- }
- @OnClick({R.id.rl_public_iv_back, R.id.public_tv_title_save})
- public void onViewClicked(View view) {
- switch (view.getId()) {
- case R.id.rl_public_iv_back:
- finish();
- break;
- case R.id.public_tv_title_save:
- break;
- }
- }
- }
- xml
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/white">
- <RelativeLayout
- android:id="@+id/${layoutName}_root"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_alignParentStart="true"
- android:layout_alignParentTop="true"
- android:background="@color/white"
- android:orientation="vertical">
- <include
- android:id="@+id/public_title"
- layout="@layout/public_title_layout_save" />
- </RelativeLayout>
- </RelativeLayout>
- manifest
- <#import "../../common/shared_manifest_macros.ftl" as manifestMacros>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="${packageName}">
- <application>
- <activity android:name="${packageName}.${activityName}"
- android:screenOrientation="portrait"
- android:theme="@android:style/Theme.Translucent.NoTitleBar" />
- </application>
- </manifest>
- template
- <?xml version="1.0"?>
- <template
- format="5"
- revision="5"
- name="WhiteTopbarActivity"
- minApi="9"
- minBuildApi="14"
- description="Creates a new activity">
- <category value="Oden" />
- <formfactor value="Mobile" />
- <parameter
- id="activityName"
- name="Activity Name"
- type="string"
- constraints="class|unique|nonempty"
- suggest="${layoutToActivity(layoutName)}"
- default="OdenActivity"
- help="The name of the activity class to create" />
- <parameter id="layoutName"
- name="Activity Layout Name"
- type="string" constraints="layout|unique|nonempty"
- suggest="${activityToLayout(activityName)}"
- default="activity_main"
- help="The name of the layout to create for the activity" />
- <parameter id="title"
- name="Title Name"
- type="string" constraints="layout|unique|nonempty"
- suggest="title"
- default="title"
- help="The Title of the activity" />
- <parameter
- id="packageName"
- name="Package name"
- type="string"
- constraints="package"
- default="com.mycompany.myapp" />
- <!-- 128x128 thumbnails relative to template.xml -->
- <thumbs>
- <!-- default thumbnail is required -->
- <thumb>template_blank_activity.png</thumb>
- </thumbs>
- <globals file="globals.xml.ftl" />
- <execute file="recipe.xml.ftl" />
- </template>
name 属性为模板名称, description 属性为模板的描述.
category 标签, 定义了模板所属的分类,, 分类名一样的模板会被归纳到同一目录下.
parameter 标签, 定义了模板输入弹窗中的输入参数, 每个 parameter 为一行
id 属性为参数唯一标识, 我们可以在代码中通过 id 来使用该参数.
name 属性为参数名称, 显示在输入控件的前面或后面.
type 属性为参数类型, 根据该属性和 constraints 属性的值综合比较后参数会被渲染成不同的输入形式, 比如 string 类型会显示输入框, 而 boolean 类型会显示一个选择框.
constraints 属性为输入约束, 常见的有 class, 代表类名; layout 代表布局名; package 代表包路径; unique 则是不能与现有的重复; nonemptye 表示不能为空.
suggest 和 default 标签, 前者是建议名称, 后者是默认名称, 前者优先级高于后者.
help 属性是参数输入提示, 当该参数获取焦点后, 对应的帮助信息会显示在对话框上.
globals 标签指定了 global 文件, global 标签定义了一系列的全局参数, 供后续模板文件使用.
execute 标签, 跟字面上的意思一样, 执行 recipe.xml.ftl 文件的内容, 将模板文件生成具体的可用文件.
recipe.xml
作用是定义输出规则
- <?xml version="1.0"?>
- <recipe>
- <merge from="root/AndroidManifest.xml.ftl"
- to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
- <instantiate from="root/src/app_package/Activity.java.ftl"
- to="${escapeXmlAttribute(srcOut)}/${activityName}.java" />
- <instantiate from="root/res/activity.xml.ftl"
- to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
- <open file="${escapeXmlAttribute(srcOut)}/${activityName}.java" />
- <open file="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
- </recipe>
- <#include > 标签那行表示包含了 recipe_manifest.xml.ftl 文件的内容, 里面是 标签, 作用是将定义的 manifest.xml.ftl 文件转化为 manifest.xml 后与项目中的 AndroidManifest.xml 文件合并, 完成了 Activity 在 AndroidManifest.xml 文件中注册的工作
instantiate 标签是 recipe.xml.ftl 文件的核心标签, 它的作用是将 from 属性的 ftl 文件转化为 to 属性的文件.
open 文件会打开对应的文件
来源: https://juejin.im/entry/5b69b6966fb9a04fea58c1ad