Templates实战之更优雅实现自定义View构造方法详解
作者:长安皈故里 时间:2021-12-22 13:22:40
问题场景
之前写过一篇文章: 2.@JvmOverloads快捷实现函数重载, 借助于Kotlin的默认参数+@JvmOverloads简化自定义View的构造方法编写:
简化是简化了,但是每次写这么一大堆还是感觉好烦啊,比如忘记AttributeSet
类怎么拼写的了等等。这就得拿出我们的秘密武器Live Templates
了。
瞧瞧Live Templates
Live Templates
可以简单理解为实时模板,代码编写中可以动态根据输入的关键字选择性的插入模板内容,比如常见的:
像我们常见的logd
、logi
、key
、const
、var
、val
等等快速生成模板代码的指定都是通过Live Templates
进行实现的,比如:
logi
key
所以上面一大堆自定义View的构造方法的模板代码当然也可以使用Live Templates
实现。
Live Templates自定义customView指令
指定声明的指令名称;
对声明的指令的功能描述;
自定义View的模板代码,其中使用
$CLASS_NAME$
、PARENT_CLASS
分别代表自定义View的类名和继承的父类类名,相当于占位符,需要开发者调用该指令时手动编写指定,这里粘贴一份具体的内容,方便大家复制:
class $CLASS_NAME$ @JvmOverloads constructor(
context: Context,
attributes: AttributeSet? = null,
defStyleAttr: Int = 0
): $PARENT_CLASS$(context, attributes, defStyleAttr) {
}
指定该指令生效的文件范围,这个不设置指令可能不会生效,比如当前我指定的为kotlin:
经过上面的配置customView
指令就生效了,我们看下效果:
当从弹出的菜单中点击该指令时,就会直接生成下面的代码:
其中两个红框中的位置就是上面$CLASS_NAME$
、PARENT_CLASS
分别对应的位置占位符,需要开发者手动编写实现。
Edit variables进一步优化
如果你感觉使用了customView
指令,还需要手动编写上面两个红框中的内容还是太麻烦,那这里我们还可以更进一步优化:
比如第一个红框中确定要自定义View的类名就是当前文件名,那我们可以把第一个红框中的内容也交给Live Templates
生成,主要就是借助Live Templates
中的Edit variables
功能
细心的读者有没有发现,Live Template
功能框中我们还有一个功能没使用到:
点开看下:
之前讲过,CLASS_NAME
和PARENT_CLASS
就是我们在Template text
内容区中设置的两个变量,分别代表自定义View的类名以及继承的父类名称。
CLASS_NAME
对应变量如果确定了就是文件名,直接在上面Expression
一一览中指定其生成规则为fileNameWithoutExtension()
,这样输入customView
时,Live Templates
就会自动帮助我们将CLASS_NAME
变量替换成当前的文件名:
第一个红框中就是自定生成的类名,我们只需要编写第二个红框中需要继承哪个父类即可。
顺便提一句,Edit variables
面板中Expression
还有很多其他的表达式生成规则:
进一步帮助我们生成模板代码,提高开发效率,感兴趣的可以自行探索。
来源:https://juejin.cn/post/7138055043076325389
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java精品项目瑞吉外卖之员工信息管理篇
![](https://img.aspxhome.com/file/2023/9/81939_0s.png)
使用Springboot 打jar包实现分离依赖lib和配置
![](https://img.aspxhome.com/file/2023/7/76537_0s.png)
Java输入输出流的使用详细介绍
![](https://img.aspxhome.com/file/2023/0/81880_0s.jpg)
mybatis plus使用redis作为二级缓存的方法
![](https://img.aspxhome.com/file/2023/0/63150_0s.png)
Java基于余弦方法实现的计算相似度算法示例
Java 关于递归的调用机制精细解读
![](https://img.aspxhome.com/file/2023/3/74983_0s.png)
SpringBoot 过滤器与拦截器实例演示
![](https://img.aspxhome.com/file/2023/9/84639_0s.png)
spring cloud oauth2 feign 遇到的坑及解决
![](https://img.aspxhome.com/file/2023/9/89619_0s.png)
Springboot集成RabbitMQ死信队列的实现
![](https://img.aspxhome.com/file/2023/9/77479_0s.png)
java Long类型转为String类型的两种方式及区别说明
Java如何使用httpclient检测url状态及链接是否能打开
java基础(System.err和System.out)详解
深入解析Jdk8中Stream流的使用让你脱离for循环
Flutter利用Hero组件实现自定义路径效果的动画
![](https://img.aspxhome.com/file/2023/3/85453_0s.png)
SpringMVC @RequestBody的使用解析
![](https://img.aspxhome.com/file/2023/1/62761_0s.jpg)
重写hashCode()和equals()方法详细介绍
![](https://img.aspxhome.com/file/2023/8/59198_0s.png)
springmvc不进入Controller导致404的问题
![](https://img.aspxhome.com/file/2023/2/62102_0s.png)
Spring Batch入门教程篇
![](https://img.aspxhome.com/file/2023/4/83014_0s.png)