概述

扩展函数:指在一个类上增加一种新的行为,甚至我们没有这个类代码的访问权限。类似Java中很多带有static方法的工具类。

优势:不需要在调用方法的时候把整个对象当作参数传入。而是像是属于扩展类的一样,可以使用this关键字和调用所有public方法。


应用场景

参考anko-common 依赖包中ContextUtils、Dialogs 等文件的写法

// 属性扩展
// 注意:anko-common包中没有扩展V4包中的Fragment,需要自己扩展,否则无法获取到ctx属性
val Fragment.ctx: Contextget() = activity// 属性扩展
val Context.ctx: Contextget() = this// 函数扩展
inline fun <reified T : View> Activity.find(id: Int): T = findViewById(id) as T
inline fun <reified T : View> Fragment.find(id: Int): T = view?.findViewById(id) as T// 函数扩展
fun Context.toast(textResource: Int) = Toast.makeText(this, textResource, Toast.LENGTH_SHORT).show()
fun Context.toast(text: CharSequence) = Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
inline fun AnkoContext<*>.longToast(textResource: Int) = ctx.longToast(textResource)
// ...略...
复制代码

1. 属性的扩展

val Fragment.ctx: Contextget() = activitypublic var TextView.text: CharSequenceget() = getText()set(v) = setText(v)
复制代码

2. 函数的扩展

fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {Toast.makeText(this, message, duration).show()
}复制代码

应用

扩展EditText的TextWatcher监听

fun EditText.beforeTextChanged(action: (s: CharSequence?, start: Int, count: Int, after: Int)->Unit) = textWatch(before = action)fun EditText.onTextChanged(action: (s: CharSequence?, start: Int, count: Int, after: Int)->Unit) = textWatch(change = action)fun EditText.afterTextChanged(action: (s: Editable?)->Unit) = textWatch(after = action)fun EditText.textWatch(before: ((s: CharSequence?, start: Int, count: Int, after: Int)->Unit)? = null,change: ((s: CharSequence?, start: Int, before: Int, count: Int)->Unit)? = null,after:  ((s: Editable?) -> Unit)? = null
) : EditText {return apply { // 这里返回EditTextval listener = object : TextWatcher{override fun afterTextChanged(s: Editable?) {after?.invoke(s)}override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {before?.invoke(s, start, count, after)}override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {change?.invoke(s, start, before, count)}}addTextChangedListener(listener)}
}
复制代码

使用

class JokeListFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {val view = inflater?.inflate(R.layout.joke_fragment_joke_list, null)return view}override fun onActivityCreated(savedInstanceState: Bundle?) {super.onActivityCreated(savedInstanceState)// 实现链式调用editText.beforeTextChanged {s, start, count, after -> Log.d("Joke", "before =$s")}.onTextChanged {s, start, count, after -> Log.d("Joke", "change =$s")}.afterTextChanged {s -> Log.d("Joke", "after =${s.toString()}")toast(s.toString())}}}复制代码

Kotlin基础 — 扩展函数相关推荐

  1. Kotlin基础:白话文转文言文般的Kotlin常识

    这是该系列的第一篇,系列文章目录如下: Kotlin基础:白话文转文言文般的Kotlin常识 Kotlin基础:望文生义的Kotlin集合操作 这个系列记录的是kotlin使用感受,其中也会穿插基础知 ...

  2. Kotlin基础学习(1)

    Kotlin基础学习(1) 本文主要讲解kotlin的部分基础知识,并不是全部基础. 提示:纯属个人理解,如有理解错误,欢迎留言指正批评. 一.Null检查机制 kotlin对于声明可为空的参数,使用 ...

  3. Kotlin Jetpack 实战:01. Kotlin 基础

    背景 近几年,Android 相关的新技术层出不穷.往往这个技术还没学完,下一个新技术又出来了.很多人都是一脸黑人问号?不少开发者甚至开始哀嚎:"求求你们别再创造新技术了,我们学不动了!&q ...

  4. Kotlin Jetpack 实战: Kotlin 基础 | 开发者说·DTalk

    本文原作者: 朱涛,原文发布于: 朱涛的自习室 https://mp.weixin.qq.com/s/MSbSPeWNlM5PJCFmLg2SVQ 背景 近几年,Android 相关的新技术层出不穷. ...

  5. Kotlin学习 PART 2:kotlin基础

    想了很久,一直在想怎么记录笔记最高效,最后感觉还是结合代码比较好. 1.整数的遍历,in表示是否在一个区间内,!in表示不再某个区间内 fun fizzBuzz(i:Int) = when { i%1 ...

  6. Kotlin基础-扩展

    /** 扩展:对既有的类增加新功能而无需继承该类,即无法获取其源代码* 主要作用:"立即"为相关类整体上添加"工具类"方法或属性* Kotlin支持:扩展函数, ...

  7. 第一章 kotlin基础知识

    第一章 kotlin基础知识 文章目录 第一章 kotlin基础知识 前言 一.kotlin是什么? 二.kotlin基础知识 1.变量的声明 2.函数定义的几种方式 3.字符串与数字的转换 4.数组 ...

  8. Kotlin学习(一):Kotlin基础知识

    Kotlin学习(一):Kotlin基础知识 定义变量常量 在Kotlin中,定义变量时有以下几点与java不同: 位置不同:在 Kotlin 中,数据类型要放到变量后面,并且用冒号(:)分隔,这正好 ...

  9. Kotlin 基础——Map集合详解

    Kotlin基础--Map集合详解 一.声明和创建Map集合 二.使用Map的方法 三.遍历Map四种方式 四.可变的Map Kotlin的Map集合用于保存key-value对,其也被分为可变的和不 ...

最新文章

  1. eclipse 的习惯配置
  2. 达摩院十大科技趋势发布:2020 非同小可!
  3. (二十)python 3 匿名函数
  4. python中的数学模块
  5. 现代软件工程系列 学生精彩文章(7) 宝贵的教训
  6. 最全Spring Boot2.x系列Config配置集成篇-1参数配置
  7. 你自己的事,你不操心谁操心?
  8. 使用netcat的正向 / 反向shell
  9. shell-6:shell中的计算$((1+1))
  10. 惠普战66一代拆机_或许这就是匠人吧 全新惠普战66二代的另类拆解
  11. webapi 状态返回 php,让WebAPI 返回JSON格式的数据实例教程
  12. Ubuntu18.04 PulseAudio实战
  13. 移动硬盘插入提示需要格式化RAW_分区变成RAW格式怎么办?
  14. 系列篇|结构光三维重建基本原理
  15. 用PuTTY 访问远程主机
  16. lisp读点坐标绘多义线_多段线点导出和导入点坐标成多段线(AutoLISP源码)——好用的AutoCAD点坐标导入导出工具...
  17. 利用遗传算法库DEAP优化交易策略
  18. iphone功率测试软件,iPhone原装5W充电头充电功率测试
  19. Android 开发 AudioRecord音频录制
  20. 2021年中国医疗美容(医美)行业发展回顾:监管不断趋严、市场规模稳步扩大,发展前景广阔[图]

热门文章

  1. PHP指定字段的多维数组排序方法
  2. C++中使用模板,new创建2维动态数组
  3. 安装与配置Flutter开发环境
  4. 20172307 2017-2018-2 《程序设计与数据结构》第7周学习总结
  5. 日本研发圆滚滚的球形无人机,被LED屏团团包围
  6. codevs——1044 拦截导弹(序列DP)
  7. 使用keytool 生成证书
  8. Ehcache整合spring配置
  9. Node开发项目管理工具 Grunt 对比 Gulp
  10. .net 按行切割数组