@coder-pig
2023-04-13T09:27:41.000000Z
字数 4199
阅读 706
2023
杰哥最近在思考如何提高公司APP的开发效率,以便挤出更多的 学(mo)习(yu) 时间。

其中一个痛点就是:手撕表单界面xml,需要频繁CV组件代码,对于这种重复性的操作,使用 Live Templates 可以明显提高开发效率。
它可不是什么新东西了,网上介绍它的文章可谓烂大街,但大都:千篇一律 + 废话多多,不信的读者可以搜几篇看看~

好,不难看出两个要点:定义代码模板 和 快捷键/缩写自动生成代码。接着图文并茂介绍下~
依次打开:Settings → Live Templates,右侧可以看到一些 内置模板:

随手点开一个,如:AndroidKotlin → newInstance(),界面结构如下:

使用 两个美元符号$来定义一个变量(参数) ,比如上面的 $fragment$,也可以理解成 占位符。没啥好说,点击 Edit variables 可以对参数进行设置:

变量生成表达式,见名知意,通过 表达式定制代码生成过程中的变量和逻辑,点击下拉可以看到 内置的一些表达式:

图中几个表达式的作用:
不用记,用到再查,idea官网都有:《predefined_functions》
对了,支持自定义Expression,ChatGPT说它除了支持Groovy外,还支持Java和Kotlin,但是搜了一圈发现基本都是Groovy写的,em...对这个回答持怀疑态度,哈哈,毕竟经常瞎编~
另外,有一点要注意:设置变量默认值,需要使用双引号(""),不然你会发现设置了默认值却没生效。当然,你也可以把默认值直接写到 Expression表达式 那里,效果也是一样的。
还有,支持指定指令生效的范围,点击Change:

配置起来还是比较简单的,接着随便新建一个 TestFragment,键入 newI + tab 即可快速生成:

内置的模板肯定是满足不了日常的业务场景的,可以按需自定义。杰哥每次写表单提交页xml真的是头皮发麻,一堆这样的组件要CV:
<TextViewandroid:id="@+id/cil_total_floor_area"android:layout_width="match_parent"android:layout_height="wrap_content"app:add_bottom_line="@{ true }"app:hint="请输入"app:input_view_dot_num="@{ 0 }"app:input_view_input_type_number="@{ true }"app:input_view_int_digit="@{ 8 }"app:must_fill_in="true"app:title="总占地面积"app:unit_text='@{ "m²" }' />
完全可以用自定义模板来简化,Copy下这段代码,ctrl + alt + a → add code template (也可以从Setting一步步打开):

然后点击 右侧+号:

这里我选择新建 Template Group,专门拿来放公司的代码模板:

新建后选中模板组Company,新建模板,一般id和title是不同,这里定义成两个变量:

点击 Edit variables 对变量进行编辑:

指定指令生效范围 为xml:

接着随便打开一个xml文件,键入 cil + tab:

可以看到:
光标先跳到title,输入 Company Address,id项自动转换并填充 company_address
简单得一批,读者还不赶紧燥起来~

snakeCase()适用于英文的场景,而日常开发中,这个title只会是中文,内置Expression并没有找到 中转英。So,只能动手写一个了。idea提供了一个 groovyScript("groovy脚本代码 / groovy脚本路径", "传入参数") 给我们调用自定义的Expression。
搜了一圈,没发现内置的Expression写在哪个文件里,无奈只能自己推敲摸索了,有知道的读者欢迎评论区告知下~
CV了一段网上的Groovy脚本代码分析:
groovyScript("def result=''; def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList(); for(i = 0; i < params.size(); i++) {result+=' * @param ' + params[i] + ((i < params.size() - 1) ? '\\n' : '')}; return result", methodParameters())
不难看出两个关键要素:(输入 + 输出):
接着就是处理中转英了,那肯定是需要调第三方API的啦,这里直接百度翻译走一波:百度翻译开放平台,注册个账号,个人认证,开通 通用文本翻译,升级 高级版:

每个月可以白嫖100w次,基本是够了,实在不够可以充值一波。处理思路也很简单:调翻译接口 + 处理响应结果返回。Groovy不太熟怎么办?问ChatGPT啊~


23333,CV一下代码就行了?就这?我只能说:兄dei,你想多了!这代码TM是错的!!!

比如Sign的加密规则是MD5,而不是sha256:

ChatGPT的确是开发利器,但是 代码的正确性 还得自己掂量掂量!!!后面又让他出了好几种写法,加之反复踩坑,终于折腾出下面的脚本(自己填下appId和appKey就能用):
import groovy.json.JsonSlurperimport java.util.concurrent.CompletableFuturedef query = _1 // 输入的中文参数def zh_pattern = /[\u4e00-\u9fa5]+/ // 匹配中文的正则// 百度翻译相关def appId = 'xxx' // 替换成自己的 App IDdef appKey = 'xxx' // 替换成自己的 App Keydef from = "zh" // 原始语言def to = "en" // 转换后的语言// 开启异步任务避免堵塞主线程def task = CompletableFuture.supplyAsync({// 构造salt参数def salt = System.currentTimeMillis().toString()// 构造Sign参数def sign = "${appId}${query}${salt}${appKey}".md5()// 拼接请求URLdef url = "http://api.fanyi.baidu.com/api/trans/vip/translate" +"?q=${URLEncoder.encode(query, "UTF-8")}" +"&from=${from}" +"&to=${to}" +"&appid=${appId}" +"&salt=${salt}" +"&sign=${sign}"// 获取响应文本,转换为Json对象def json = new JsonSlurper().parseText(new URL(url).text)// 异常直接返回,正常返回翻译结果:转小写 + 空格转换为下划线 + 替换,return json.error_code ? "${json}" : json.trans_result[0].dst.toLowerCase().replaceAll(" ", "_").replace(",", "")})// 输入内容不为空 + 字符串长度大于1 + 且由中文组成 → 才触发转换,减少无效调用引起的卡顿if (query != null && query.toString().length() > 1 && query.toString().matches(zh_pattern)) {task.thenAccept({ result -> return result })task.join()} else {return "123"}
接着把脚本复制到 你喜欢的目录下,比如我这里直接放E盘根目录,接着设置下变量id的Expression:

保存完,就是见证奇迹的时刻:

细心你的应该发现了效果图有些 卡顿,笔者猜测:每次字符变化都会触发一次转换,简单的四个字会触发脚本四次,这里虽然我做了限制,2个字符以上才请求,所以其实会触发3次请求。
笔者想到的一个解决思路是:本地起一个服务器做中转,等待一段时间间隔,只转发最后的请求,避免重复调用。
不过实施起来还是有些麻烦的,有更好简单思路的童鞋欢迎在评论区指点迷津,万分感激~
对了,最后补充一点,如果你想和别人Share你自定义的模板,可以在 → IDEA的配置路径: (~/Library/Application Support/JetBrains/templates) 找到相应组的xml (我的是AS):

把这个文件夹发过去,对方放到 templates 目录下即可(没有自己建)~

关于Live Templates的探索就到这,希望对你开发效率的提高有所裨益,谢谢~
====== 内容补充分割线 ======
2023.04.12
JB家的IDE 内置两个无法修改的预定义实时模板变量:
$END$ → 表示代码段完整时的光标位置,用了它就不能再按Tab跳到下个变量了。$SELECTION$ → 用于环绕模板,使用 Ctrl + Alt + T 触发,展开选择模板后,选定的文本将按照模板中指定的内容进行包装。看不懂,没关系,随手写个简单打印日志的简单模板示例:

接着打开一个kt文件,随便敲点东西,按Ctrl + Alt + T,选择上面的模板,即可实现自动填充:

