AndroidStudio 4.1 사용자 정의 템 플 릿 사용 방법

AndroidStudio 4.0 이전 에는 template 폴 더 에 freemarker 의 사용자 정의 템 플 릿 을 사용 할 수 있 으 며,AndroidStudio 폴 더 에 사용자 정의 템 플 릿 을 임의로 추가 할 수 있 습 니 다.
그러나 4.1 버 전부터 새로운 방식 을 제공 합 니 다.Geminio 는 Kotlin 형식 으로 새로운 template 를 만 들 고 플러그 인 형식 을 사용 해 야 사용자 정의 템 플 릿 을 사용 할 수 있 습 니 다.며칠 동안 모색 한 끝 에 해결 되 었 습 니 다.
내 프로젝트 는 MVVM 의 개발 프레임 워 크 를 사용 하 는 것 이다.새로운 페이지 를 만 들 때마다 네 개의 파일 을 새로 만들어 야 한다.Activity/Fragment,ViewModel,Repository,xml 파일 을 많이 쓰 면 짜증 이 난다.사용자 정의 템 플 릿 을 사용 한 이후 머리카락 이 적 게 빠 졌 다.
착공!!!시작!!!
준비 하 다.
개발 도구 AndroidStudio 4.1
템 플 릿 기본 코드 설정

https://github.com/JetBrains/intellij-platform-plugin-template 을 열 고 녹색\#Use this template\#를 클릭 하여 자신의 github 에 템 플 릿 을 만 듭 니 다.
그리고 AndroidStudio 를 사용 하여 템 플 릿 을 로 컬 에 다운로드 합 니 다.
 
부호화
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 의 plugin Group,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.
MyProjectManager Listener 수정

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 폴 더 를 만들어 서 사용자 정의 템 플 릿 을 설치 합 니 다.

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<Template> = listOf(
   // activity   
   mvvmActivityTemplate,
   // fragment   
   mvvmFragmentTemplate
 )
}
2.mvvmActivityTemplate.kt 를 만 듭 니 다.
이 파일 은 Activity 를 만 들 때 입력 하 는 정보 입 니 다.예 를 들 어 Activity Name,layotName,packageName,사용 가능 여부 등 입 니 다.
​ mvvmActivityTemplate.kt

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<Template> = listOf(
   // activity   
   mvvmActivityTemplate,
   // fragment   
   mvvmFragmentTemplate
 )
}
3.mvvmActivity Recipe.kt 를 만 듭 니 다.
이 파일 은 Activity,레이아웃 파일 등 생 성 된 파일 을 폴 더 에 저장 하 는 데 사 용 됩 니 다.원래 Activity 를 AndroidManifest 에 직접 추가 할 계획 이 었 으 나 generateManifest 에 문제 가 있어 생 성 된 플러그 인 을 사용 할 수 없 게 되 었 습 니 다.잠시 제거 하고 수 동 으로 추가 할 수 밖 에 없 었 습 니 다.
mvvmActivityRecipe.kt

package other.mvvm.activity

import com.android.tools.idea.wizard.template.ModuleTemplateData
import com.android.tools.idea.wizard.template.RecipeExecutor
import other.mvvm.activity.res.layout.mvvmActivityXml
import other.mvvm.activity.src.app_package.mvvmAcitivityKt
import other.mvvm.activity.src.app_package.mvvmRepository
import other.mvvm.activity.src.app_package.mvvmViewModel


fun RecipeExecutor.mvvmActivityRecipe(
  moduleData: ModuleTemplateData,
  activityClass: String,
  layoutName: String,
  packageName: String
) {
 val (projectData, srcOut, resOut) = moduleData
 val ktOrJavaExt = projectData.language.extension
// generateManifest(
//   moduleData = moduleData,
//   activityClass = "${activityClass}Activity",
//   activityTitle = activityClass,
//   packageName = packageName,
//   isLauncher = false,
//   hasNoActionBar = false,
//   generateActivityTitle = true,
//   requireTheme = false,
//   useMaterial2 = false
// )

 val mvvmActivity = mvvmAcitivityKt(projectData.applicationPackage, activityClass, layoutName, packageName)
 //   Activity
 save(mvvmActivity, srcOut.resolve("${activityClass}Activity.${ktOrJavaExt}"))
 //   xml
 save(mvvmActivityXml(packageName, activityClass), resOut.resolve("layout/${layoutName}.xml"))
 //   viewmodel
 save(mvvmViewModel(packageName, activityClass), srcOut.resolve("${activityClass}ViewModel.${ktOrJavaExt}"))
 //   repository
 save(mvvmRepository(packageName, activityClass), srcOut.resolve("${activityClass}Repository.${ktOrJavaExt}"))
}
4.mvvmAcitivityKt 를 만 듭 니 다.
이 파일 은 Activity 의 템 플 릿 코드 를 만 들 고 자신의 상황 에 따라 스스로 조정 하 는 데 사 용 됩 니 다.
mvvmAcitivityKt.kt

package other.mvvm.activity.src.app_package

fun mvvmAcitivityKt(
  applicationPackage:String?,
  activityClass:String,
  layoutName:String,
  packageName:String
)="""
package ${packageName}
import android.os.Bundle
import com.bigademo.baselib.base.BaseActivity
import ${applicationPackage}.R
import ${applicationPackage}.BR;
import ${applicationPackage}.databinding.Activity${activityClass}Binding
class ${activityClass}Activity : BaseActivity<${activityClass}ViewModel, Activity${activityClass}Binding>() {
 override fun getContentView(): Int {
  return R.layout.${layoutName}
 }

 override fun init(savedInstanceState: Bundle?) {
  super.init(savedInstanceState)
  isShowTopBar = false
 }

 override fun initViewModel() {
  viewModel = ${activityClass}ViewModel()
 }
 /**
  *	       
  */
 override fun observe() {

 }
 
 /**
  *        
  */
 override fun onClick() {
 }

 override fun initData() {
  super.initData()
 }
 override fun initVariableId(): Int {
  TODO("Not yet implemented")
 }
 } 
"""
5.mvvmRepository 를 작성 합 니 다.
이 파일 은 mvvm 의 reposcory 층 코드 입 니 다.
mvvmRepository.kt

package other.mvvm.activity.src.app_package

fun mvvmRepository(
  packageName:String,
  activityClass:String
)="""
package ${packageName}

import androidx.lifecycle.MutableLiveData
import com.shide.baselib.base.basemvvm.BaseRepository
import com.shide.baselib.base.basemvvm.BaseViewModel
import com.shide.baselib.net.exception.ShideApiException
import kotlinx.coroutines.CoroutineScope

class ${activityClass}Repository(
 baseViewModel: BaseViewModel,
 coroutineScope: CoroutineScope,
 errorLiveData: MutableLiveData<ShideApiException>
) : BaseRepository(baseViewModel, coroutineScope, errorLiveData) {
}
"""
6.mvvmViewModel 을 작성 합 니 다.이것 은 mvvm 의 viewmodel 층 mvvmViewModel.kt 입 니 다.

package other.mvvm.activity.src.app_package
fun mvvmViewModel(
  packageName:String,
  activityClass:String
)="""
package ${packageName}
import androidx.lifecycle.viewModelScope
import com.bigademo.baselib.base.basemvvm.BaseViewModel
class ${activityClass}ViewModel : BaseViewModel() {
 private val repo by lazy { ${activityClass}Repository(this, viewModelScope, errorLiveData) }
} 
"""
7.mvvmActivity Xml 를 작성 합 니 다.이 파일 은 레이아웃 파일 을 만 드 는 데 사용 되 는 mvvmActivity Xml.kt 입 니 다.

package other.mvvm.activity.res.layout

fun mvvmActivityXml(
  packageName: String,
  activityClass: String
) = """
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

 <data>

 </data>
 
 <androidx.constraintlayout.widget.ConstraintLayout 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"
 tools:context="${packageName}.${activityClass}Activity">
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
8.plugin.xml 수정
org.jetbrains.android,org.jetbrains.kotlin,com.intellij.modules.java 의 의존 도 를 추가 합 니 다.
applicationService 와 procject Service 의 값 을 수정 합 니 다.
applicationListenesv 에서 listener 의 값 을 수정 합 니 다.
방금 추 가 된 클래스 에 wizardTemplate Provider 를 추가 합 니 다.

<idea-plugin>
 <id>com.bigaddemo.mvvm</id>
 <name>bigaddemo_MVVM</name>
 <vendor>bigademo</vendor>

 <!-- Product and plugin compatibility requirements -->
 <!-- https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html -->
 <depends>org.jetbrains.android</depends>
 <depends>org.jetbrains.kotlin</depends>
 <depends>com.intellij.modules.java</depends>
 <depends>com.intellij.modules.platform</depends>

 <extensions defaultExtensionNs="com.intellij">
 <applicationService serviceImplementation="com.bigaddemo.mvvm.services.MyApplicationService" />
 <projectService serviceImplementation="com.bigaddemo.mvvm.services.MyProjectService" />
 </extensions>

 <applicationListeners>
 <listener class="com.bigaddemo.mvvm.listeners.MyProjectManagerListener" topic="com.intellij.openapi.project.ProjectManagerListener" />
 </applicationListeners>

 <extensions defaultExtensionNs="com.android.tools.idea.wizard.template">
 <wizardTemplateProvider implementation="other.SamplePluginTemplateProviderImpl" />
 </extensions>
</idea-plugin>
jar 파일 생 성
AS 맨 위 에서 Run plugin 을 실행 하 는 것 을 선택 하 십시오.성공 하면 build/libs 에서 해당 하 는 jar 파일 을 찾 을 수 있 습 니 다.마지막 으로 AS 설정 에서 이 jar 패키지 에 추 가 된 plugin 을 AS 로 다시 시작 하면 됩 니 다.
 

안 드 로 이 드 스튜디오 4.1 사용자 정의 템 플 릿 사용 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 안 드 로 이 드 스튜디오 4.1 사용자 정의 템 플 릿 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기