@coder-pig
2023-04-13T17:27:41.000000Z
字数 4199
阅读 303
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:
<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 + 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.JsonSlurper
import java.util.concurrent.CompletableFuture
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参数
def sign = "${appId}${query}${salt}${appKey}".md5()
// 拼接请求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}"
// 获取响应文本,转换为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,选择上面的模板,即可实现自动填充: