漯河市万金镇网站建设广州网站设计易企建站

pingmian/2025/10/13 17:01:52/文章来源:
漯河市万金镇网站建设,广州网站设计易企建站,wordpress rest Api定制,口碑好的福州网站建设Android Studio 代码模板插件 背景 可以跳过背景和简述#xff0c;从模板插件实现开始看. 开发新页面时#xff0c;原先需要写一堆模板代码。比如用Databinding写列表结构的页面#xff0c;需要手写以下文件#xff1a; XxActivity.ktXxFragment.ktXxViewModel.ktXxListA…Android Studio 代码模板插件 背景 可以跳过背景和简述从模板插件实现开始看. 开发新页面时原先需要写一堆模板代码。比如用Databinding写列表结构的页面需要手写以下文件 XxActivity.ktXxFragment.ktXxViewModel.ktXxListAdapter.ktXxListItemModel.ktUI数据结构XxBean.kt接口数据结构XxBeanModelConvert.ktXxRetrofitApi.ktXxRetrofitRepository.ktyymoudle_xx_layout_activity.xmlyymoudle_xx_layout_fragment.xmlyymoudle_xx_layout_list_item.xml列表item 并且类文件间还有相互的引用关系。 如果能有一套代码模板可以一键生成最小单元功能代码确实能提高新开发页面的效率。加快1~2个小时不为过吧 简述 Android Studio Editor Android Studio 自带了两种代码模板入口为Settings - Edit File and Code Templates : 倾向生成单个文件Live Templates 在单个文件中快捷生成代码例如logd生成Log.d(TAG, String) File and Code Templates 和Live Templates Android Studio Plugin 于是把目光投向了代码模板插件搜索template,可以看到很多比如这个Jetpack Compose UI Architecture Plugin。 如何我实现自己的代码模板插件 模板插件实现 Android Studio 是基于 IntelliJ IDEA开发的Android Studio可以使用IntelliJ上丰富的插件。 IntelliJ提供了一个用于创建模板代码插件的模板项目基于这个模板项目改造 。 最终效果 选择模板 - 模板配置 - 生成代码 选择模板 模板配置 生成代码 插件工程的创建与配置 工程创建 模板项目仓库地址: https://github.com/JetBrains/intellij-platform-plugin-template 按照步骤 Use this template- Create a new repository 在自己的github下生成仓库。 这是我生成的项目仓库地址https://github.com/AlvinScrp/android-code-template 修改配置 用Android Studio打开这个项目先修改一波基础配置,修改内容的commit: https://github.com/AlvinScrp/android-code-template/commit/c0eaaa9c7a5451f29efb1b5f91eec131568d5f89 注意要导入Android代码模板需要的 wizard-template.jar, 其实是从Android Studio目录/plugins/android/lib中复制过来的。 模板插件代码编写 generator包下都是我们新写的代码代码调用顺序为 PluginGeneratorProvider.kt - Generator.kt - Recipe.kt PluginGeneratorProvider 对应【选择模板】界面 package com.github.alvinscrp.androidcodetemplate.generator import com.android.tools.idea.wizard.template.Template import com.android.tools.idea.wizard.template.WizardTemplateProvider import com.github.alvinscrp.androidcodetemplate.generator.mvvm.jlMvvmGenerator import com.github.alvinscrp.androidcodetemplate.generator.util.AppType class PluginGeneratorProvider : WizardTemplateProvider() { override fun getTemplates(): ListTemplate listOf( //这里建了三套模板jlMvvmGenerator(AppType.FXJ), jlMvvmGenerator(AppType.HYK), jlMvvmGenerator(AppType.MC) ) }在plugin.xml中注册该provider extensions defaultExtensionNscom.android.tools.idea.wizard.template wizardTemplateProvider implementationcom.github.alvinscrp.androidcodetemplate.generator.PluginGeneratorProvider / /extensionsGenerator.kt package com.github.alvinscrp.androidcodetemplate.generator.mvvm import com.android.tools.idea.wizard.template.* import com.android.tools.idea.wizard.template.impl.activities.common.MIN_API import com.github.alvinscrp.androidcodetemplate.generator.util.AppType /** * 模板配置需要的参数根据你的需要在这里添加 */ fun jlMvvmGenerator(appType: AppType): Template { return template { name DataBinding Mvvm Temp Code - ${appType.key} description 生成一套基于DataBinding的MVVM代码包括Activity、Fragment、ViewModel、ListAdapter、 ListItemModel、BeanModelConvert、Bean、 Retrofit Api、 Repository minApi MIN_API category Category.Other formFactor FormFactor.Mobile screens listOf( WizardUiContext.ActivityGallery, WizardUiContext.MenuEntry, WizardUiContext.NewProject, WizardUiContext.NewModule) val bizNameParameter stringParameter { name Business Name英文小写开头camel命名可以多单词 default template help 业务名称英文可以多单词camel命名用来作为生成的各种文件的前缀 constraints listOf(Constraint.NONEMPTY) } val classPackageNameParameter stringParameter { name Class Package Name: 这个不要改它 help 文件名称生成文件的存放位置不是APP包名 default com.github.alvinscrp constraints listOf(Constraint.PACKAGE) suggest { packageName } } val isCreateActivityParameter booleanParameter { name 生成Activity,需手动加入清单文件 help default false } widgets( TextFieldWidget(bizNameParameter), TextFieldWidget(classPackageNameParameter), CheckBoxWidget(isCreateActivityParameter) ) recipe { mvvmRecipe( it as ModuleTemplateData, bizNameParameter.value, classPackageNameParameter.value, appType, isCreateActivityParameter.value ) } } }对应【模板配置】界面 Recipe.kt package com.github.alvinscrp.androidcodetemplate.generator.mvvm import com.android.tools.idea.wizard.template.ModuleTemplateData import ... /** * 模板代码文件的创建与保存 * 这里有几个变量需要注意下 * * //当前批量生成类文件所在目录 com.example.x.y * classPackageName : String * * //模块名例如 user * val moduleName moduleData.rootDir.name.toLowerCaseAsciiOnly() * * //模块包名例如com.example.user , 在模块AndroidManifest.xml中配置的那个一定要注意 * val modulePackageName projectData.applicationPackage * */ fun RecipeExecutor.mvvmRecipe( moduleData: ModuleTemplateData, bizName: String, classPackageName: String, appType: AppType, isCreateActivity: Boolean ) { val (projectData, srcOut, resOut) moduleData val moduleName moduleData.rootDir.name.toLowerCaseAsciiOnly() val modulePackageName projectData.applicationPackage ?: // println(----${projectData.rootDir},${projectData.applicationPackage},${moduleData.rootDir.name},${moduleData.packageName}) if(isCreateActivity) { save( mvvmActivityTemp(appType, modulePackageName, classPackageName, moduleName, bizName), srcOut.resolve(${bizName}/ui/${firstUppercase(bizName)}Activity.kt) )//插入Manifest 这个代码运行报错反正我也用不到就不管了// generateManifest( // moduleData moduleData, // activityClass ${firstUppercase(bizName)}Activity, // packageName ${classPackageName}.${bizName}.ui, // isLauncher false, // hasNoActionBar false, // isNewModule false, // isLibrary false, // generateActivityTitle false // )} save( mvvmFragmentTemp(appType, modulePackageName, classPackageName,moduleName, bizName), srcOut.resolve(${bizName}/ui/${firstUppercase(bizName)}Fragment.kt) ) ......代码较多省略 save( fragmentLayoutTemp(appType,classPackageName, bizName), resOut.resolve(layout/${fragmentLayoutName(moduleName, bizName)}.xml) ) }xxTemp.kt 每个temp function都对应一个目标代码文件。 我们可以先在业务项目里写一套可运行的Template代码。 插件可以基于这套Template代码修改。 以ActivityTemp.kt举例 package com.github.alvinscrp.androidcodetemplate.generator.mvvm.temp import com.github.alvinscrp.androidcodetemplate.generator.util.AppType import com.github.alvinscrp.androidcodetemplate.generator.util.activityLayoutName import com.github.alvinscrp.androidcodetemplate.generator.util.firstUppercase import com.github.alvinscrp.androidcodetemplate.generator.util.fragmentClassName /** * 生成XxActivity文件的内容你的项目里是啥就是啥不要用我这个模板 */ fun mvvmActivityTemp( appType: AppType, modulePackageName: String, classPackageName: String, moduleName: String, bizName: String ): String { return package ${classPackageName}.${bizName}.ui import android.os.Bundle import ${appType.fullBaseActivity()} import ${modulePackageName}.R class ${firstUppercase(bizName)}Activity : ${appType.simpleBaseActivity()}() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.${activityLayoutName(moduleName, bizName)}) replaceFragment(R.id.fragment_container, ${fragmentClassName(bizName)}.newInstance(123), false) } } .trimIndent() }TemplUtils.kt 在编写Temp代码时发现有些地方还是要注意的 class名大写开头layout.xml文件名小写字母下划线xxDataBinding通过layout.xml文件名来转换更方便. wizard-template.jar提供了很多的方法给我们例如camelCaseToUnderlines()underscoreToLowerCamelCase()underscoreToCamelCase()等等 package com.github.alvinscrp.androidcodetemplate.generator.util import com.android.tools.idea.wizard.template.camelCaseToUnderlines import com.android.tools.idea.wizard.template.underscoreToCamelCase import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly /** * 形式 ab_cd_ef 必须都是小写以下划线连接 */ fun layoutPrefix(moduleName: String, bizName: String): String { return ${moduleName.toLowerCaseAsciiOnly()}_${camelCaseToUnderlines(bizName).toLowerCaseAsciiOnly()}_template } fun fragmentLayoutName(moduleName: String, bizName: String): String { return ${layoutPrefix(moduleName,bizName)}_fragment } /** * moduleName 可能出现的形式 user、 User 、 UserCenter 、User_Center 、 UserCenter_kkk * 因为要作为布局文件名的前缀必须都转成小写 */ fun fragmentDataBindingName(moduleName: String, bizName: String): String { val layoutPrefix layoutPrefix(moduleName, bizName) //sd_te -- SdTe var camelCaseName underscoreToCamelCase(layoutPrefix) return ${camelCaseName}FragmentBinding } fun firstUppercase(param: String): String { return param.replaceFirstChar { it.uppercase() } }模板插件测试 代码写完就可以测试插件效果了AndroidStudio工具栏运行Run Plugin 如果可以正常编译会自动打开一个IntelliJ IDEA窗口。 此时可以 New Project 或者 Open 现有APP项目。 最后按照【选择模板 - 模板配置 - 生成代码】的顺序就可以生成代码了。 模板插件导出与安装 通过上面的测试你发现写的插件很好用 赋能项目如下步骤 导出插件jar位置 build/libs/android-code-template-0.0.1.jar。 导入到Android Studio的pluginsSettings - Plugins - Install Plugin from Disk…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站建设到本地浙江省湖州艺术与设计学校官网

bark_tokenize_input函数 bark是没有语言控制选项的,但是官方的版本无法运行中文bark_tokenize_input会调用bert_tokenize函数,bark_tokenize_input函数对中文分词失效,也就是导致不支持中文的原因。 void bark_tokenize_input(struct bark_…

做网站 简单外包wordpress系统

分类 名称 类比 说明压缩工具 RAR for Linux WinRAR Linux中压缩解压RAR格式文件的工具联络聊天 EVA QQ 一个界面、使用 类似QQ的聊天工具。MP3 播放 XMMS WinAmp Linux中MP3播放器下载工具 Downloader4X FlashGet Linux中的多线程下载利器流媒体播放 RealPlayer 10 RealPlaye…

做家装的网站有什么不同苏州餐饮 网站建设

任务 设计8路节日彩灯控制器,要求在Protues中设计接口电路图,并编程实现节日彩灯闪烁方式的控制: 通过P1.0到P1.2来控制3个按键。3个按键分别对应3种彩灯闪烁方式。彩灯闪烁方式分别为:从上往下的循环、从下往上以及从中间向两边…

湖北建设执业资格注册中心网站网站的通知栏一般用什么控件做

【QT5-程序控制电源-RS232-SCPI协议-上位机-基础样例【1】】 1、前言2、实验环境3、自我总结1、基础了解仪器控制-熟悉仪器2、连接SCPI协议3、选择控制方式-程控方式-RS2324、代码编写 4、熟悉协议-SCPI协议5、测试实验-测试指令(1)硬件连接(…

潞城网站建设公司seo网络优化师招聘

Google身份验证器Google Authenticator是谷歌推出的一款基于时间与哈希的一次性密码算法的两步验证软件令牌,此软件用于Google的认证服务。此项服务所使用的算法已列于RFC 6238和RFC 4226中。谷歌验证器上的动态密码按照时间或使用次数不断动态变化(默认…

北京朝阳做网站wordpress 中文插件下载

需求描述对于数据分析人员来说,工作的基础是数据,没有数据分析就无从谈起,即巧妇难为无米之炊。#数据库# #数据迁移# #Oracle# 然而,数据分析往往在实验环境或者准生产环境中开展,而数据分布在生产环境,因此…

seo网站优化知识安阳做一个网站多少钱

深度学习包含深度迁移学习,它们都利用了深层神经网络(Deep Neural Network,DNN)来处理数据,并从中学习特征。但是,它们也有一些区别。 深度学习是一种机器学习方法,它通过多层神经网络来自动学…

制作网站制作网站建设的如何把网站能搜到

键盘和鼠标是与计算机交互的重要外围设备。有些人可能会争辩说,你只需要这些设备中的一个,但事实上,只使用其中一个设备的电脑可能非常困难。但是,如果你的鼠标或笔记本电脑的触控板突然停止工作,而你无法修复它或无法使用备用鼠标,该怎么办? 在这种情况下,你可以使用…

隆昌市住房和城乡建设厅网站网站设计是用ps做图吗

原文链接: go-zero 的自适应熔断器 上篇文章我们介绍了微服务的限流,详细分析了计数器限流和令牌桶限流算法,这篇文章来说说熔断。 熔断和限流还不太一样,限流是控制请求速率,只要还能承受,那么都会处理&…

dw怎么做网站珠海网站建设方案开发

(请先看置顶博文)本博打开方式,请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净 题目大意:王老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。例如:…

北京最大做网站的公司万全孔家庄做网站

深度剖析:六大虚拟DOM库的奥秘与应用场景 前言 虚拟DOM(Document Object Model)是用于表示和操作HTML文档的抽象数据结构。虚拟DOM库是构建用户界面的重要工具,它们提供了高效的更新机制、组件化开发等功能,使开发者…

福田设计网站华为手机软文范文300

大家好,我是等天黑。相信很多朋友应该注意到了,我最近发了很多系统设计的文章。是的,到目前为止,已经发了有 7 篇文章。这些内容主要翻译自 Alex Xu 的 《System Design Interview》,有卷一和卷二两本。System Design …

群晖nas做网站网站空间是先备案后买

智能优化算法应用:基于人工蜂群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于人工蜂群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工蜂群算法4.实验参数设定5.算法结果6.…

网站建设实验心得用.net做网站好 还是用php

匹配模式 每个目标都有个叫<Target_Name>DAGToDAGISel的SelectionDAGISel子类.它通过实现子类的Select方法来选指. 如SPARC中的SparcDAGToDAGISel::Select()(见lib/Target/Sparc/SparcISelDAGToDAG.cpp文件).接收要匹配的SDNode参数,返回代表物理指令的SDNode值;否则出…

临河网站建设视觉设计和ui设计有什么区别

在VBA编辑器中&#xff0c;你可以创建、编辑和运行VBA宏代码&#xff0c;以实现自动化任务和自定义Word 功能。如果你是VBA编程初学者&#xff0c;可以在VBA编辑器中查看Word VBA宏代码示例&#xff0c;以便更好地了解如何使用VBA编写代码。 要打开VBA编辑器&#xff0c;你可以…

宽屏大气企业网站源码嘉兴网站建设seo

2024最新同城上门预约家政按摩源码简介&#xff1a; 开源无需授权2024最新同城上门预约家政按摩小程序&#xff0b;公众号H5&#xff0b;APP源码系统下载&#xff0c;前端采用uni-app开发&#xff0c; 后端thinkphp框架开发。适配多端&#xff08;小程序&#xff0b;公众号H5&…

phython 做的网站济南网站建设哪家便宜

在现在这个繁荣的游戏开发行业中&#xff0c;选择合适的游戏引擎是非常重要的。其中&#xff0c;Unreal Engine作为一款功能强大的游戏引擎&#xff0c;在业界广受赞誉。那Unreal Engine游戏引擎究竟有哪些优势&#xff0c;带大家简单的了解一下。 图形渲染技术 Unreal Engin…

教育考试类网站建设电子商务及网站建设

1,使用数组方法: 1) 数字转字符串,字符串按照小数点.分割 2) 整数部分拆分成字符串数组,并倒叙 3) 遍历, 按照每三位添加逗号,号 4) 拼接整数部分小数部分 function format_width_array(number) { // 将数字转换为千分位字符串const arr String(number).split(.);// 整数…

建网站什么样的域名最好外包网站建设价格

Class/Interface增强允许增加&#xff0c; 对已有的方法增加可选参数 添加方法&#xff0c;事件&#xff0c;事件处理 参考接口 对存在的方法添加出口&#xff0c;其中包括方法开始前的出口&#xff08;Pre-Exit&#xff09;&#xff0c;方法结束快结束的出口(Post-Exit)&#…