快速生成MVP代码模板
序言
MVP的优势相信大家都耳熟能详了,但是它的缺点也很明显,需要开发人员创建多个类,复制黏贴,重复的做着同样的事,浪费大量的时间和精力。接下来我们就想办法生成一个代码模板,在创建activity或fragment时,自动生成相关的文件,以及固定的代码模板。
结果:
1.选中包名目录,右键创建MvpActivity;
2.输入要创建的Activity的名称(Test);
3.看结果(我的模板里没有model层的类)
附上实现快速生成mvp代码模板的具体操作及代码
1.globals.xml.ftl,需要生成类的名称声明
<?xml version="1.0"?>
<globals>
<#assign Collection=extractLetters(ActivityClass)>
<#assign collection_name=Collection?lower_case>
<!-- 这里声明全局变量-->
<global id="activity_layout" value="${collection_name}" />
<global id="ActivityName" value="${Collection}Activity" />
<global id="PresenterName" value="${Collection}ActivityPre" />
<global id="ContractName" value="${Collection}ActivityCtr" />
<global id="IPresenterName" value="${Collection}ActivityIP" />
<global id="IViewName" value="${Collection}ActivityIV" />
<global id="packageName" value="自己的包名" />
</globals>
2.recipe.xml.ftl,制定需要生成的文件名称和位置
扫描二维码关注公众号,回复:
6474091 查看本文章
<?xml version="1.0"?>
<recipe>
<!--merge 表示需要合并到指定文件的内容 (表示AndroidManifest声明新建的Activity) -->
<merge from="root/AndroidManifest.xml.ftl"
to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
<!-- instantiate 表示创建文件到指定文件夹 (把需要创建文件的模板放在根目录文件夹下对应文件夹,针对自己的项目修改路径) -->
<instantiate from="root/res/layout/activity_mvp.xml.ftl"
to="${escapeXmlAttribute(resOut)}/layout/activity_${activity_layout}.xml" />
<instantiate from="root/src/app_package/MvpActivity.java.ftl"
to="${escapeXmlAttribute(srcOut)}/mvp/view/activity/${ActivityName}.java" />
<instantiate from="root/src/app_package/MvpPresenter.java.ftl"
to="${escapeXmlAttribute(srcOut)}/mvp/presenter/${PresenterName}.java" />
<instantiate from="root/src/app_package/MvpContract.java.ftl"
to="${escapeXmlAttribute(srcOut)}/mvp/contract/${ContractName}.java" />
</recipe>
3.template.xml,activity的信息配置
<?xml version="1.0"?>
<template
format="5"
revision="5"
name="MvpActivity"
minApi="9"
minBuildApi="14"
description="Creates a new mvp activity">
<category value="Activity" />
<formfactor value="Mobile" />
<!--parameter 标签表示创建时需要输入的属性 -->
<parameter
id="ActivityClass"
name="Activity ClassName"
type="string"
constraints="nonempty"
default="Mvp" />
<thumbs>
<thumb>template_blank_activity.png</thumb>
</thumbs>
<globals file="globals.xml.ftl" />
<execute file="recipe.xml.ftl" />
</template>
4.AndroidManifest.xml.ftl,清单文件下添加activity配置的模板
<#import "../../common/shared_manifest_macros.ftl" as manifestMacros>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="${packageName}">
<application>
<activity android:name=".mvp.view.activity.${ActivityName}"
android:configChanges="orientation|screenSize|keyboardHidden"
android:launchMode="singleTask"
android:windowSoftInputMode="stateHidden|adjustResize"/>
</application>
</manifest>
5.MvpActivity.java.ftl,Activity的代码模板,可根据自己的代码修改模板
package ${packageName}.mvp.view.activity;
import ${packageName}.R;
import ${packageName}.mvp.base.BaseActivity;
import ${packageName}.mvp.contract.${ContractName};
import ${packageName}.mvp.presenter.${PresenterName};
public class ${ActivityName} extends BaseActivity<${PresenterName}> implements ${ContractName}.${IViewName} {
@Override
public int getLayoutId() {
return R.layout.activity_${activity_layout};
}
@Override
public void initPresenter() {
mPresenter.setVM(this);
}
@Override
public void initView() {
}
@Override
public void showLoading(String title) {
}
@Override
public void stopLoading() {
}
@Override
public void showErrorTip(String msg) {
}
}
6.activity_mvp.xml.ftl,对应的布局文件,可根据自己的代码修改模板
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="center"
android:text="Hello World!" />
</LinearLayout>
7.MvpContract.java.ftl,Contract类的代码模板,可根据自己的代码修改模板
package ${packageName}.mvp.contract;
import ${packageName}.mvp.base.BasePresenter;
import ${packageName}.mvp.base.BaseView;
public interface ${ContractName} {
interface ${IViewName} extends BaseView {
}
abstract class ${IPresenterName} extends BasePresenter<${IViewName}> {
}
}
8.MvpPresenter.java.ftl,Presenter类的代码模板,可根据自己的代码修改模板
package ${packageName}.mvp.presenter;
import ${packageName}.mvp.contract.${ContractName};
public class ${PresenterName} extends ${ContractName}.${IPresenterName} {
}
1.将以上文件放在MvpActivity文件夹下(里面的文件结构参考其他activity模板)
并放入目录:AndroidStudio\plugins\android\lib\templates\activities\
2.MvpFragment模板类似MvpActivity模板,不同点
a.并放入目录:AndroidStudio\plugins\android\lib\templates\other\
b.不需要AndroidManifest.xml.ftl文件
c.template.xml文件模板信息不同:
<?xml version="1.0"?>
<template
format="5"
revision="3"
name="MvpFragment"
minApi="7"
minBuildApi="8"
description="Creates a new mvp fragment">
<category value="Fragment" />
<formfactor value="Mobile" />
<dependency name="android-support-v4" revision="8" />
<parameter
id="className"
name="Fragment Name"
type="string"
constraints="class|nonempty|unique"
default="Mvp"
help="The name of the fragment class to create" />
<parameter
id="fragmentName"
name="Fragment Layout Name"
type="string"
constraints="layout|nonempty|unique"
default="fragment_mvp"
visibility="includeLayout"
suggest="fragment_${classToResource(className)}"
help="The name of the layout to create" />
<thumbs>
<thumb>template_blank_fragment.png</thumb>
</thumbs>
<globals file="globals.xml.ftl" />
<execute file="recipe.xml.ftl" />
</template>
3.重启Android Studio即可。