AndroidStudio4.1 自定义模板的使用方法

AndroidStudio4.0之前,可以在template的文件夹里使用freemarker的自定义模板,可以在AndroidStudio的文件夹中,随意的添加适合自己的自定义模板

但是从4.1版本开始提供新的方式,Geminio,用Kotlin的形式编写新的template,而且需要使用插件的形式,才能使用自定义的模板,摸索了好几天,终于解决了。

我的项目是使用MVVM的开发框架,每次在编写一个新的页面的时候,就需要新建四个文件Activity/Fragment, ViewModel, Repository, xml文件,写的多了就会很烦。自从使用了自定义的模板以后,头发掉得都少了。

开工!!!搞起!!!

准备

开发工具 AndroidStudio4.1

模板基础代码配置

AndroidStudio4.1 自定义模板的使用方法_第1张图片

打开 https://github.com/JetBrains/intellij-platform-plugin-template,点击绿色的#Use this template#,按步骤在自己的github上创建模板。

然后使用AndroidStudio 将模板下载到本地。

AndroidStudio4.1 自定义模板的使用方法_第2张图片 

编码

添加wizard-template.jar

在根目录里添加lib文件夹,并添加AndroidStudio安装目录里的wizard-template.jar,位于 /Applications/Android\ Studio.app/Contents/plugins/android/lib/目录下。

修改build.gradle.kts

在dependencies里添加wizard-template.jar的依赖

dependencies {
  detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.15.0")
  compileOnly(files("lib/wizard-template.jar"))
}

修改gradle.properties

修改gradle.properties中的pluginGroup, pluginName_, platformPlugins, platformVersion。

pluginGroup = com.bigaddemo.mvvm
pluginName_ = bigaddemo_MVVM
platformVersion = 2020.2
platformPlugins = java, com.intellij.java, org.jetbrains.android, android, org.jetbrains.kotlin

将默认的listeners的父包名,调整为自己想要的样子,例如com.company.app

修改MyProjectManagerListener

internal class MyProjectManagerListener : ProjectManagerListener {

 override fun projectOpened(project: Project) {
  projectInstance = project
  project.getService(MyProjectService::class.java)
 }

 override fun projectClosing(project: Project) {
  projectInstance = null
  super.projectClosing(project)
 }

 companion object {
  var projectInstance: Project? = null
 }
}

在src/main/kotlin里创建other文件夹用于放置自定义模板

AndroidStudio4.1 自定义模板的使用方法_第3张图片

正式开始编写自定义模板,以Activity为例。

1. 实现WizardTemplateProvider

SamplePluginTemplateProviderImpl

package other
import com.android.tools.idea.wizard.template.Template
import com.android.tools.idea.wizard.template.WizardTemplateProvider
import other.mvvm.activity.mvvmActivityTemplate
import other.mvvm.fragment.mvvmFragmentTemplate
class SamplePluginTemplateProviderImpl : WizardTemplateProvider() {

 override fun getTemplates(): List