作者:Antonio Leiva

时间:Jan 11, 2017

原文链接:https://antonioleiva.com/extension-functions-kotlin/

扩展函数是Kotlin提供的非常酷的特性,在编写Android应用程序时,你将发现自己会大量使用它。

我们必须承认Android框架有时做些事有点困难,在Java中我们唯一的解决方案是把我们要做事封装起来,或利用可读性差的类静态方法。

你想怎样才能加额外函数到框架类?这就是Kotlin扩展函数允许我们做的。

Kotlin扩展函数

如其名称所隐含的,扩展函数是一种函数,它帮助我们扩展类功能,而无需涉及它们的代码。现在让我们来看怎样定义这些函数,以及一些我个人认为非常有用的例子。

怎样定义扩展函数?

就如同你平常编写函数那样,在分隔点之前放置类名称。这些函数可以放在任何位置上,不过通常在一个扩展(Extensions)文件,这个扩展文件甚至不需要包含一个类。

一个非常简单的例子,我们要视图有visible(),使它可见。我们这样编写:

 fun View.visible() {
this.visibility = View.VISIBLE
}

如你所见,使用该类的功能和属性时,我加上this保留字,就像我们是在类内部,但是你也可以省略:

 fun View.visible() {
visibility = View.VISIBLE
}

一些有趣的例子

我来说明两三个我喜欢的例子,它们很好的展示了扩展函数的能力。

第一个有用的例子是你在扩展(inflate)视图内的适配器。通常你这样用:

 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.view_item, parent, false)
return ViewHolder(v)
}

在扩展(inflate)视图的代码行中使用了parent,太复杂了,并且99%时间里通常与任何其它适配器相同。为什么不给ViewGroups扩展视图的能力?

 fun ViewGroup.inflate(layoutRes: Int): View {
return LayoutInflater.from(context).inflate(layoutRes, this, false)
}

现在你可以在上面的代码使用它:

 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val v = parent.inflate(R.layout.view_item)
return ViewHolder(v)
}

一个使用图像的非常类似例子也可以这样做。例如,如果你使用Picasso库,你需要典型的构建器加载图像:

 Picasso.with(imageView.context).load(url).into(imageView)

你想要如何能够告知ImageView自己加载URL吗?

 fun ImageView.loadUrl(url: String) {
Picasso.with(context).load(url).into(this)
} imageView.loadUrl(url)

扩展属性

就像你能够扩展函数一样,同理也能处理属性。你需要记住的就一件事,扩展属性不能保存状态,而且需要用已有函数请求或更改对象的状态:

 val ViewGroup.children: List
get() = (0..childCount -1).map { getChildAt(it) }

这个属性由ViewGroup的children中取出。

现在你就可以直接替代他们:

 parent.children.forEach { it.visible() }

注意

it是一个保留字,当函数仅有一个输入值时,用于访问函数的输入值。如我们在其他文章所读到,你可以命名那些输入值,当有多个输入值时,在Lambda表达式左边写上par。

结论

利用扩展函数和扩展属性,你可以扩展任何类(即使你没有访问其代码),而且如同它们是类的一部分一样使用那些扩展函数和属性。你将看到的唯一的事就是使用导入一个额外的文件。

如果你喜欢Kotlin,要进一步的学习,建议阅读《Android开发者的Kotlin》一书,在书中我介绍这点和你在Android应用程序开发期间的许多事情。

Kotlin的扩展函数:扩展Android框架(KAD 08)的更多相关文章

  1. 用Kotlin创建第一个Android项目(KAD 01)

    原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...

  2. Kotlin【简介】Android开发 配置 扩展

    重要资源 官方资源:官网 . 官网源码 .官网文档 . 在线 IDE .GitHub 中文资源:中文官网 .中文文档  离线文档:PDF 文件 . PDF 文件 GitBook 版 .ePUB 文件  ...

  3. Android框架式编程之Android Architecture Components

    1. 当前Android开发面临的问题 Android开发不同于传统的桌面程序开发,桌面程序一般都有唯一的快捷方式入口,并且常作为单进程存在:而一个典型的Android应用通常由多个应用组件构成,包括 ...

  4. 【编程语言】Kotlin之扩展函数

    简介: 平时Android开发中会使用各种各样的工具类函数,大部分工具类都是对原有对象的一种扩展,例如: public static void startActivity(Activity act, ...

  5. IOS 与ANDROID框架及应用开发模式对照一

    IOS 和ANDROID操作系统都是眼下流行的移动操作系统,被移动终端和智能设备大量採用,两者都採用了先进的软件技术进行设计,为了方便应用开发两者都採用了先进的设计模式. 两者在框架设计上都採用了什么 ...

  6. 【Android 系统开发】Android框架 与 源码结构

    一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...

  7. IOS 与ANDROID框架及应用开发模式对比一

    IOS 和ANDROID操作系统都是目前流行的移动操作系统,被移动终端和智能设备大量采用,两者都采用了先进的软件技术进行设计,为了方便应用开发两者都采用了先进的设计模式.两者在框架设计上都采用了什么技 ...

  8. Android 框架式编程 —— 起篇

    一般的,在开发的时候,写过的代码在需求变更后,发现需要改动非常多的地方,那么说明之前的代码的架构肯定是存在问题的. 下面我们结合面向对象的六大基本原则谈Android 框架式编程.首先先介绍一下面向对 ...

  9. Android框架 与 源码结构

    一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...

随机推荐

  1. JS基础——事件绑定

    上一篇博客JS事件对象中,老师问JS事件处理和VB中的事件处理有什么联系?先来解决一下这个问题.举个VB.net中事件处理的样例(JS敲久了,VB习惯的都不熟悉了,看来得常常回想了): 1.事件处理V ...

  2. C# 在本地创建文件夹及子文件夹

    string dict = @"d:\估价报告\"; if (!Directory.Exists(dict)) { Directory.CreateDirectory(dict); ...

  3. Android的FrameLayout使用要注意的问题

    帧布局FrameLayout在Android的五大布局中是最简单的布局方式,在需要布局中的控件有重叠的情况下才使用. 今天Shamoo使用FrameLayout的时候,发现布局里面的控件设置layou ...

  4. zepto.js的基本介绍与使用

    最近看到了一篇文章,是介绍一种新的js框架,名为zepto.js,他适用于移动设备已经桌面浏览器除了ie系列的.. 他兼容jquery的API,所以学起来或用起来并不吃力.他比jquery的优势在于1 ...

  5. Android项目---LayoutParams

    LinearLayout.LayoutParams extends ViewGroup.MarginLayoutParams java.lang.Object    ↳ android.view.Vi ...

  6. ASP.NET MVC之单元测试

    ASP.NET MVC之单元测试分分钟的事2014-07-15 13:05 by 书洞里的猫, 550 阅读, 4 评论, 收藏, 编辑 一.为什么要进行单元测试? 大部分开发者都有个习惯(包括本人在 ...

  7. 分页存储过程实现-SqlServer

    一个通用的分页存储过程实现-SqlServer(附上sql源码,一键执行即刻搭建运行环境) 使用前提 查询表必须有ID字段,且该字段不能重复,建议为自增主键 背景 如果使用ADO.NET进行开发,在查 ...

  8. 控制winform中控件的输入格式

    private void txtNum1_KeyPress(object sender, KeyPressEventArgs e) { ') && e.KeyChar != '\r' ...

  9. Api 和 Spi

    目录 背景Java类库中的实例如何实现这种结构?备注 背景返回目录 Java 中区分 Api 和 Spi,通俗的讲:Api 和 Spi 都是相对的概念,他们的差别只在语义上,Api 直接被应用开发人员 ...

  10. 迟到的 WPF 学习 —— 入门

    之所以说"迟到的",是因为我太晚才开始学习 WPF 了,之前 WPF 刚发布的时候有过粗浅了解,那时的 WPF 还非常简陋,VS 提供的内置控件十分匮乏,让我这样的非常依赖 Win ...