本文正在参加「金石方案」

杰哥最近在思考怎么进步公司APP的开发功率,以便挤出更多的 学(mo)习(yu) 时间。

花3分钟,重拾开发效率神器 → Live Templates

其间一个痛点便是:手撕表单界面xml需求频繁CV组件代码,关于这种重复性的操作,运用 Live Templates 能够明显进步开发功率。

它可不是什么新东西了,网上介绍它的文章可谓烂大街,但大都:千人一面 + 废话多多,不信的读者能够搜几篇看看~

花3分钟,重拾开发效率神器 → Live Templates

好,不难看出两个要点:界说代码模板快捷键/缩写主动生成代码。接着图文并茂介绍下~

0x1、入门:蜻蜓点水

顺次翻开:SettingsLive Templates,右侧能够看到一些 内置模板

花3分钟,重拾开发效率神器 → Live Templates

顺手点开一个,如:AndroidKotlinnewInstance(),界面结构如下:

花3分钟,重拾开发效率神器 → Live Templates

运用 两个美元符号$来界说一个变量(参数) ,比方上面的 $fragment$,也能够理解成 占位符。没啥好说,点击 Edit variables 能够对参数进行设置:

花3分钟,重拾开发效率神器 → Live Templates

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

花3分钟,重拾开发效率神器 → Live Templates

图中几个表达式的作用:

  • blockCommentStart() 和 blockCommentEnd() → 界说代码块注释的开始和完毕方位。这些表达式将主动刺进恰当的注释符号,例如 /* 和 */,以及恰当的空格和换行符。
  • camelCase() → 将字符串转化成驼峰式命名法(camel case)。
  • capitalize() → 将字符串的榜首个字符转化成大写。
  • capitalizeAndUnderscore() → 将字符串转化为大写并用下划线分隔单词。
  • clipboard() → 在代码块模板中刺进剪贴板中的内容。

不必记,用到再查,idea官网都有:《predefined_functions》

对了,支撑自界说Expression,ChatGPT说它除了支撑Groovy外,还支撑Java和Kotlin,可是搜了一圈发现基本都是Groovy写的,em…对这个回答持怀疑态度,哈哈,究竟经常瞎编~

另外,有一点要注意:设置变量默认值,需求运用双引号(“”),否则你会发现设置了默认值却没收效。当然,你也能够把默认值直接写到 Expression表达式 那里,作用也是相同的。

还有,支撑指定指令收效的规模,点击Change:

花3分钟,重拾开发效率神器 → Live Templates

装备起来还是比较简略的,接着随意新建一个 TestFragment,键入 newI + tab 即可快速生成:

花3分钟,重拾开发效率神器 → Live Templates


0x2、基础:自界说模板

内置的模板肯定是满足不了日常的业务场景的,能够按需自界说。杰哥每次写表单提交页xml真的是头皮发麻,一堆这样的组件要CV:

<TextView
    android: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 + aadd code template (也能够从Setting一步步翻开):

花3分钟,重拾开发效率神器 → Live Templates

然后点击 右侧+号

花3分钟,重拾开发效率神器 → Live Templates

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

花3分钟,重拾开发效率神器 → Live Templates

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

花3分钟,重拾开发效率神器 → Live Templates

点击 Edit variables 对变量进行修改:

花3分钟,重拾开发效率神器 → Live Templates

指定指令收效规模 为xml:

花3分钟,重拾开发效率神器 → Live Templates

接着随意翻开一个xml文件,键入 cil + tab

花3分钟,重拾开发效率神器 → Live Templates

能够看到:

光标先跳到title,输入 Company Address,id项主动转化并填充 company_address

简略得一批,读者还不赶忙燥起来~

花3分钟,重拾开发效率神器 → Live Templates


0x3、进阶:自界说中文转英文的Expression

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())

不难看出两个关键要素:(输入 + 输出):

  • _1 → 获取第1个输入参数,同理_2、_3获取第2、3个输入参数;
  • return result → 返回处理后的成果;

接着便是处理中转英了,那肯定是需求调第三方API的啦,这儿直接百度翻译走一波:百度翻译敞开平台,注册个账号,个人认证,开通 通用文本翻译,升级 高档版

花3分钟,重拾开发效率神器 → Live Templates

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

花3分钟,重拾开发效率神器 → Live Templates

花3分钟,重拾开发效率神器 → Live Templates

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

花3分钟,重拾开发效率神器 → Live Templates

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

花3分钟,重拾开发效率神器 → Live Templates

ChatGPT的确是开发利器,可是 代码的正确性 还得自己衡量衡量!!!后面又让他出了好几种写法,加之重复踩坑,终于折腾出下面的脚本(自己填下appId和appKey就能用):

import groovy.json.JsonSlurper
import java.security.MessageDigest
import java.util.concurrent.CompletableFuture
import org.apache.commons.lang.StringUtils
def query = _1  // 输入的中文参数
def zh_pattern = /[\u4e00-\u9fa5]+/    // 匹配中文的正则
// 百度翻译相关
def appId = 'xxx' // 替换成自己的 App ID
def appKey = 'xxx' // 替换成自己的 App Key
def from = "zh" // 原始言语
def to = "en"   // 转化后的言语
// 开启异步任务防止堵塞主线程
def task = CompletableFuture.supplyAsync({
    // 构造salt参数
    def salt = System.currentTimeMillis().toString()
    // 构造Sign参数:将字符串转化成字节数组,并计算md5
    def signStr = "${appId}${query}${salt}${appKey}"
    def md = MessageDigest.getInstance("MD5")
    md.update(signStr.getBytes())
    byte[] digest = md.digest()
    def sb = new StringBuffer()
    for (byte b : digest) {
        def hex = Integer.toHexString(b & 0xFF)
        if (hex.length() == 1) {
            sb.append('0')
        }
        sb.append(hex)
    }
    def sign = sb.toString()
    // 拼接恳求URL
    def 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}"
    // 获取呼应文本
    def response = new URL(url).text
    // 转化为Json对象
    def json = new JsonSlurper().parseText(response)
    // 反常状态处理
    if (json.error_code) return "${json}"
    // 返回翻译成果:转小写 + 空格转化为下划线 + 替换,
    return StringUtils.lowerCase(json.trans_result[0].dst).replaceAll(" ", "_").replace(",", "")
})
// 输入内容不为空 + 字符串长度大于1 + 且由中文组成 → 才触发转化,削减无效调用引起的卡顿
if (query != null && query.toString().length() > 1 && query.toString().matches(zh_pattern)) {
    task.thenAccept({ result -> return result })
    task.join()
} else {
    return ""
}

接着把脚本复制到 你喜爱的目录下,比方我这儿直接放E盘根目录,接着设置下变量id的Expression:

花3分钟,重拾开发效率神器 → Live Templates

保存完,便是见证奇迹的时间:

花3分钟,重拾开发效率神器 → Live Templates

仔细你的应该发现了作用图有些 卡顿,笔者猜想:每次字符变化都会触发一次转化,简略的四个字会触发脚本四次,这儿虽然我做了约束,2个字符以上才恳求,所以其实会触发3次恳求。

笔者想到的一个解决思路是:本地起一个服务器做中转等待一段时间距离,只转发最终的恳求,防止重复调用。

不过施行起来还是有些费事的,有更好简略思路的童鞋欢迎在谈论区指点迷津,万分感激~

对了,最终弥补一点,如果你想和别人Share你自界说的模板,能够在 → IDEA的装备途径: (~/Library/Application Support/JetBrains/templates) 找到相应组的xml (我的是AS):

花3分钟,重拾开发效率神器 → Live Templates

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

花3分钟,重拾开发效率神器 → Live Templates

关于Live Templates的探索就到这,期望对你开发功率的进步有所裨益,谢谢~