本文正在参加「金石方案」
杰哥最近在思考怎么进步公司APP的开发功率,以便挤出更多的 学(mo)习(yu) 时间。
其间一个痛点便是:手撕表单界面xml,需求频繁CV组件代码,关于这种重复性的操作,运用 Live Templates 能够明显进步开发功率。
它可不是什么新东西了,网上介绍它的文章可谓烂大街,但大都:千人一面 + 废话多多,不信的读者能够搜几篇看看~
好,不难看出两个要点:界说代码模板 和 快捷键/缩写主动生成代码。接着图文并茂介绍下~
0x1、入门:蜻蜓点水
顺次翻开:Settings → Live Templates,右侧能够看到一些 内置模板:
顺手点开一个,如:AndroidKotlin → newInstance(),界面结构如下:
运用 两个美元符号$来界说一个变量(参数)
,比方上面的 $fragment$
,也能够理解成 占位符。没啥好说,点击 Edit variables 能够对参数进行设置:
变量生成表达式,见名知意,经过 表达式定制代码生成过程中的变量和逻辑,点击下拉能够看到 内置的一些表达式:
图中几个表达式的作用:
- blockCommentStart() 和 blockCommentEnd() → 界说代码块注释的开始和完毕方位。这些表达式将主动刺进恰当的注释符号,例如 /* 和 */,以及恰当的空格和换行符。
- camelCase() → 将字符串转化成驼峰式命名法(camel case)。
- capitalize() → 将字符串的榜首个字符转化成大写。
- capitalizeAndUnderscore() → 将字符串转化为大写并用下划线分隔单词。
- clipboard() → 在代码块模板中刺进剪贴板中的内容。
不必记,用到再查,idea官网都有:《predefined_functions》
对了,支撑自界说Expression,ChatGPT说它除了支撑Groovy外,还支撑Java和Kotlin,可是搜了一圈发现基本都是Groovy写的,em…对这个回答持怀疑态度,哈哈,究竟经常瞎编~
另外,有一点要注意:设置变量默认值,需求运用双引号(“”),否则你会发现设置了默认值却没收效。当然,你也能够把默认值直接写到 Expression表达式 那里,作用也是相同的。
还有,支撑指定指令收效的规模,点击Change:
装备起来还是比较简略的,接着随意新建一个 TestFragment,键入 newI + tab 即可快速生成:
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 + a → add code template (也能够从Setting一步步翻开):
然后点击 右侧+号:
这儿我挑选新建 Template Group,专门拿来放公司的代码模板:
新建后选中模板组Company,新建模板,一般id和title是不同,这儿界说成两个变量:
点击 Edit variables 对变量进行修改:
指定指令收效规模 为xml:
接着随意翻开一个xml文件,键入 cil + tab:
能够看到:
光标先跳到title,输入 Company Address,id项主动转化并填充 company_address
简略得一批,读者还不赶忙燥起来~
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的啦,这儿直接百度翻译走一波:百度翻译敞开平台,注册个账号,个人认证,开通 通用文本翻译,升级 高档版:
每个月能够白嫖100w次,基本是够了,实在不行能够充值一波。处理思路也很简略:调翻译接口 + 处理呼应成果返回。Groovy不太熟怎么办?问ChatGPT啊~
23333,CV一下代码就行了?就这?我只能说:兄dei,你想多了!这代码TM是错的!!!
比方Sign的加密规则是MD5,而不是sha256:
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:
保存完,便是见证奇迹的时间:
仔细你的应该发现了作用图有些 卡顿,笔者猜想:每次字符变化都会触发一次转化,简略的四个字会触发脚本四次,这儿虽然我做了约束,2个字符以上才恳求,所以其实会触发3次恳求。
笔者想到的一个解决思路是:本地起一个服务器做中转,等待一段时间距离,只转发最终的恳求,防止重复调用。
不过施行起来还是有些费事的,有更好简略思路的童鞋欢迎在谈论区指点迷津,万分感激~
对了,最终弥补一点,如果你想和别人Share你自界说的模板,能够在 → IDEA的装备途径: (~/Library/Application Support/JetBrains/templates) 找到相应组的xml (我的是AS):
把这个文件夹发过去,对方放到 templates 目录下即可(没有自己建)~
关于Live Templates的探索就到这,期望对你开发功率的进步有所裨益,谢谢~