原文标题:Kotlin for Android (IV): Custom Views and Android Extensions

原文链接:http://antonioleiva.com/kotlin-android-custom-views/

原文作者:Antonio Leiva(http://antonioleiva.com/about/

原文发布:2015-05-07

在阅读了扩展函数和默认值能做什么后,你可能想知道接下来是什么。如我们在Kotlin的第一篇文章说的那样,该语言可以使得Android开发更简单,所以还有很多事情我想谈谈。

定制视图

如果你还记得,在谈论Kotlin局限性时,我提到Kotlin前期版本(直至M10版本)不能够创建定制视图。其原因是我们只有一个选择:每个类仅能创建一个构造函数。由于使用可选参数,我们能按照自己需要产生构造函数的各种变化,通常,这就足够了。这里有一个例子:

 class MyClass(param: Int, optParam1: String = "", optParam2: Int = 1)
{


 init {

 // Initialization code

 }

}

现在用唯一的构造函数,我们可以有四种方法产生类:

 val myClass1 = MyClass(1)
val myClass2 = MyClass(1, "hello")
val myClass3 = MyClass(param = 1, optParam2 = 4)
val myClass4 = MyClass(1, "hello", 4)

如你所见,我们只是用可选参数就得到很多组合。但是,如果我们试图通过扩展普通视图来创建Android定制视图,就带来一个问题。为了正确地工作,定制视图需要重载多个构造函数,我们没有方法实现它。幸好,从M11版本开始,我们有类似Java的方法,可声明多个构造函数了。下面是维持正方形比例的ImageView例子:

 class SquareImageView : ImageView {

     public constructor(context: Context) : super(context) {
} public constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
} public constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
} override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
val width = getMeasuredWidth()
setMeasuredDimension(width, width)
}
}

十分简单吧。但或许不太详细,不过至少我们现在有方法实现了。

Kotlin Android扩展

在Kotlin M11版本中,还增加一个新插件,它可以帮助我们(Android开发者)以更便捷方法访问在XML中声明的视图。在你们遇到Butterknife时,有些人是会记住它使用起来更简单。

Kotlin Android扩展实际就是视图绑定。在代码中,它允许你通过视图的id就能用XML视图。不需要用任何外部注释或findViewById方法就可自动创建它们的属性。

要使用新插件,你需要安装Kotlin Android Extensions并将新的classpath添加到buildscript依赖关系中(在你的主build.gradle中):

 buildscript {



 dependencies {
…

classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
}

}

假设你要声明下面main.xml</strong/>布局:

 <FrameLayout

xmlns:android="..."

 android:id="@+id/frameLayout"

 android:orientation="vertical"

 android:layout_width="match_parent"

 android:layout_height="match_parent"> 

 <TextView

 android:id="@+id/welcomeText"

android:layout_width="wrap_content"

 android:layout_height="wrap_content"/>

 </FrameLayout>

如果你要在Activity中使用这些视图,你只需要导入这个xml文件的symthetic属性

 import kotlinx.android.synthetic.<xml_name>.*

在我们例子中,它就是main

 import kotlinx.android.synthetic.main.*

你现在就可以用视图的id访问它

 override fun onCreate(savedInstanceState: Bundle?) {

super<BaseActivity>.onCreate(savedInstanceState)
setContentView(R.id.main)

frameLayout.setVisibility(View.VISIBLE)

 welcomeText.setText("I´m a welcome text!!")

}

总结

这两项新特性的实现,明确地表明Kotlin团队非常感兴趣改善Android开发者的生活,让他们的生活更加轻松自如。他们还发布了Anko库,用DSL从Kotlin文件创建Android布局。我还没有使用过它的主要功能,但是在处理Android视图时,你可以用它来简化你的代码,在我上传到Github中的Kotlin项目里有一些它的例子。你可以找到这些例子以及其他许多东西。

下一篇文章将讨论Lambda表达式的使用以及它们怎样帮助我们简化代码和扩展编程语言。这十分有趣!对于我来说,与Java 1.7比较这是Kotlin最强大的一面。

前一篇:http://www.cnblogs.com/figozhg/p/4996136.html

用Kotlin开发Android应用(IV):定制视图和Android扩展的更多相关文章

  1. 用Kotlin实现Android定制视图(KAD 06)

    作者:Antonio Leiva 时间:Dec 27, 2016 原文链接:https://antonioleiva.com/custom-views-android-kotlin/ 在我们阅读有关c ...

  2. 用Kotlin开发Android应用(I):介绍

    关于Kotlin,网上已有一些介绍的文章,包括Antonio Leiva的这组blog翻译稿.不过,我还是想跟进它们.翻译它们,以锻炼自己的英文翻译.各位高手发现问题,请及时“拍砖”. 原文题目:Ko ...

  3. 用Kotlin开发Android应用(II):创建新项目

    这是关于Kotlin的第二篇.各位高手发现问题,请继续“拍砖”. 原文标题:Kotlin for Android(II): Create a new project 原文链接:http://anton ...

  4. [Android]使用Kotlin开发Android(二)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4829007.html [TOC] 使用Kotlin+OkHtt ...

  5. 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统(瘋耔修改篇二)

    第四章.Android编译系统与定制Android平台系统 4.1Android编译系统 Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同 ...

  6. 深入浅出 - Android系统移植与平台开发(十一)- Android系统的定制(瘋耔修改篇一)

    首先非常感谢原文作者为我们提供的知识库,因为有你们的贡献,我们的开发难度更显简单 原文 :   http://blog.csdn.net/mr_raptor/article/details/30113 ...

  7. 使用Kotlin开发Android应用(I):简单介绍

    使用Kotlin开发Android应用(I):简单介绍 @author ASCE1885的 Github 简书 微博 CSDN 原文链接 Kotlin是一门基于JVM的编程语言.它正成长为Androi ...

  8. 用kotlin方式打开《第一行代码:Android》之开发酷欧天气(1)

    参考:<第一行代码:Android>第2版--郭霖 注1:本文为原创,例子可参考郭前辈著作:<第一行代码:Android>第2版 注2:本文不赘述android开发的基本理论, ...

  9. Google Android Studio Kotlin 开发环境配置

    Google 近日开发者大会宣布Kotlin成为Android开发的第一级语言,即Android官方开发语言,可见Google对Kotlin的重视,本文就介绍一下Android Studio下的Kot ...

随机推荐

  1. ReceiveQueue

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace NetF ...

  2. JSON和JS对象之间的互转

    1. jQuery插件支持的转换方式 $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2. 浏览器支持的 ...

  3. 引用类型-RegExp类型

    JavaScript高级程序设计(第三版)笔记-第五章-RegExp类型 定义正则表达式有两种方式 1.用字面量形式定义正则表达式: ver expression = /patterns/flags; ...

  4. iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流

    在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,C ...

  5. 1Z0-053 争议题目解析304

    1Z0-053 争议题目解析304 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 304.What privileges must be granted to allow an a ...

  6. MySQL学习(一)MySQLWorkbench(MySQL可视化工具)下载,安装,测试连接,以及注意事项

    PS:MySQLWorkbench是MYSQL自带的可视化工具,无论使用哪个可视化工具,其实大同小异,如果想以后走的更远的话,可以考虑使用命令行操作数据库MYSQL.可视化工具让我们初学者更能理解数据 ...

  7. 【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数

    很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在 ...

  8. 初识Spring

    Spring简介 说到Spring就得提到它的作者"Rod Johnson",2002年他编写了<Expert One-on_One java EE设计与开发>一书.在 ...

  9. Windows下程序启动时出现0xc000007b错误的解决方案

    一.背景介绍 不久前用Qt开发了一款小工具在公司使用,Debug运行时一切正常.可是当Release编译发布打包之后,运行时弹出这样的提示框: 略一思考,首先排除了DLL缺失的可能性.我知道Qt应用程 ...

  10. 【转】单例模式(Singleton)

    首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过单例模式来避免两个打印作业同时输 ...