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


猜你喜欢
- 本文实例为大家分享了android UI绘制加减号按钮的具体代码,供大家参考,具体内容如下在项目中我们常常会用到这么一个view。这时候我们
- java中Path是什么?在计算机上安装Java后,需要设置PATH环境变量以便从任何目录方便地运行可执行文件(javac.exe,java
- 本文实例为大家分享了C#基于Sockets类实现TCP通讯的具体代码,供大家参考,具体内容如下最终效果TCPClientusing Syst
- 文件数据流在java语言中,进行文件输入和输出时,经常会使用到FileIntputStream和FileOutputStream两个文件数据
- SSM框架是JavaWeb必学的框架,虽说基本的增删改查很简单,但是当面临一些特殊情况时,有时还是会显得手足无措,此篇用来记录一些特殊场景下
- Q1: Object类型包含哪些方法?A1: Object类型共包含6个方法,Equals, GetHashCode, ToString,
- Java File类 mkdir 不能创建多层目录File f = new File("/home/jp/Upload"
- 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java
- 本文为大家分享了AForge实现C#摄像头视频录制功能的具体方法,供大家参考,具体内容如下1. 概述最近由于兴趣学习了下在C#上使用AFor
- spring task和线程池的研究最近因工作需求,研究了一下spring task定时任务,和线程池,有了一定收获,记录一下涉及如下内容1
- String 不是简单类型,而是一个类,它被用来表示字符序列。字符本身符合 Unicode 标准,其初始化方式有两种。如:String gr
- 使用对象访问类中的成员:对象名.成员变量;对象名.成员方法();成员变量的默认值:具体实例代码:public class StudentTe
- 打开首页,明显看到链接是https打头,https和http的通信协议差别,在于https安全性更高:http和https的差别很明显,二者
- 先扯再说最近一直在研究某个国产开源的MySQL数据库中间件,拉下其最新版的代码到eclipse后,启动起来,然后做各种测试和代码追踪;用完想
- 一、前言本文主要来介绍一个实际案例就是如何通过这个框架来修改系统的地理位置信息来实现隐藏功能,在如今社交工具的发展特别是微信,他有一个实时位
- JVM与DalvikAndroid应用程序运行在Dalvik/ART虚拟机,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。Dal
- 摘要:用spring-boot开发RESTful API非常的方便,在生产环境中,对发布的API增加授权保护是非常必要的。现在我们来看如何利
- requestFoucs();无效。requestFoucsFromTouch();无效。webview.setTouchListener;
- 逻辑描述:现在我们想在B层和D层加上接口层,并使用工厂。而我们可以将创建B和创建D看作是两个系列,然后就可以使用抽象工厂进行创建了。配置文件
- Java中的final关键字1、修饰类的成员变量 这是final的主要用途之一,和C/C++的const,即该成员被修饰为常量,意味着不可修