Kotlin 主要由 JetBrains 开发,能与 Java 互通,但拥有 Java 不支持的功能。Google 在今年 I/O 2017 开发者大会中宣布,正式把 Kotlin 纳入 Android 程序的一级开发语言(First-class language)。并且,Android Studio 3.0将会支持Kotlin,不用再安装额外插件。
对于学习用Kotlin来开发Android还是有必要了解的,下面是本人用Kotlin写一个ListView列表时用的到Kotlin的知识,如果不准确的地方,欢迎拍砖。
1,类,继承 (界面需要集成Activity)
class 声明
class Invoice{ }
构造函数
类可以有一个主构造函数以及多个二级构造函数。主构造函数是类头的一部分:跟在类名后面(可以有可选的类型参数)。
class Person constructor(firstName: String){ }
如果主构造函数没有注解或可见性说明,则 constructor 关键字是可以省略:
class Person (firstName: String){ }
二级构造函数
如果类有主构造函数,每个二级构造函数都要,或直接或间接通过另一个二级构造函数代理主构造函数。在同一个类中代理另一个构造函数使用 this 关键字:
class Person(val name: String) { constructor (name: String, paret: Person) : this(name) { parent.children.add(this) } }
继承
Kotlin 中所有的类都有共同的父类 Any
声明一个明确的父类,需要在类头后加冒号再加父类:
open class Base(p: Int) class Derived(p: Int) : Base(p)
如果类有主构造函数,则基类可以而且是必须在主构造函数中立即初始化。
最后
class ListTestActivity : FragmentActivity(){ var mListContent: ListView? = null var mTextTitle:TextView? = null var mAdapter: MyAdapter? = null var mDataSource: ArrayList<String>? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_list_test) initView() initData() initListener() } }
官网: http://kotlinlang.org/docs/reference/classes.html
大神翻译: https://github.com/huanglizhuo/kotlin-in-chinese/blob/master/ClassesAndObjects/Classes-and-Inheritance.md
2,as 强制转型 (初始化控件)
as “不安全”的转换符
如果转换是不被允许的那么转换符就会抛出一个异常。因此我们称之为不安全的。在kotlin 中 我们用前缀 as 操作符
fun initView() { mListContent = findViewById(R.id.lv_content) as ListView mTextTitle = findViewById(R.id.tv_title) as TextView }
as?
为了避免抛出异常,可以用 as? 这个安全转换符,这样失败就会返回 null
3,初始化对象
kotlin 没有new 关键字,直接初始化
Kotlin 里面List没有设置数据的方法,直接使用ArrayList
for循环, 中断和继续标签
loop@ for (i in 1..100) { for (j in 1..100) { if (...) break@loop } }
initData()
var mDataSource: ArrayList<String>? = null fun initData() { // //静态调用 // Person.total() // val data = DataBean("张三",10) // data.age = 2 // for (i in 1 until 10){ // // } mDataSource = arrayListOf() mAdapter = MyAdapter(mDataSource, this) mListContent?.adapter = mAdapter Handler().postDelayed({ for (i in 0..20) { mDataSource?.add("index " + i.toString()) } //mAdapter? 等mAdapter为空的时候,后面不执行 mAdapter?.notifyDataSetChanged() },1000) }
4,初始化事件响应
lambda 表达式
当就一个参数时,可以省略。用内部的 “it” 来替代。
当参数不使用的时候,可以用 “_” 来取代this@ListTestActivity 确认指向
fun initListener(){ mTextTitle?.setOnClickListener{ //as? 强制转型不成功 返回Null //v -> 可以省略,使用关键词it if(validText(it as? TextView)){ Toast.makeText(this@ListTestActivity,(it as TextView).text.toString(),Toast.LENGTH_SHORT).show() } } mListContent?.setOnItemClickListener { _, _, _, _ -> startActivity(Intent(this,TestTwoActivity::class.java)) } }
5,实体类
data class 数据类
我们经常创建一个类,除了持有数据,其他的什么也不做。在这样的类里,一些标准功能往往是重复的。在Kotlin,这被称为 data class 和标记为数据:
data class User(val name: String, val age: Int)
编译器会自动的根据在主构造函数中声明的所有属性添加下面方法:
equals()/hashCode() pair,
toString() of the form “User(name=John, age=42)”,
componentN()
copy() function
原文: http://kotlinlang.org/docs/reference/data-classes.html
大神翻译: https://github.com/huanglizhuo/kotlin-in-chinese/blob/master/ClassesAndObjects/Data-Classes.md
companion object 静态属性,方法
Kotlin 移除了 static 的概念。通常用 companion object 来实现类似功能
class Person { // var age: Int?=null // get() = field // set(value){ // field = value // } companion object { val STATE_AIDL = 1 fun total(): String { return "hello" } } } //调用 Person.total() Person.STATE_AIDL
6,Adapter
构造器的初始化
class MyAdapter(ds: List<String>?, context: Context) : BaseAdapter() { var mDataSource: List<String>? = null var mInflater: LayoutInflater? = null //初始化 init { mDataSource = ds mInflater = LayoutInflater.from(context) } override fun getCount(): Int { // return when (mDataSource) { // null -> 0 // else -> mDataSource!!.size // } //类型安全,左边表达式为null ,返回右边;否则,返回左边,类似java三目运算符 return mDataSource?.size?:0 } }
嵌套类(ViewHolder)
类可以标记为 inner 这样就可以访问外部类的成员。内部类拥有外部类的一个对象引用:
class Outer{ inner class ViewHolder { var textContent: TextView? = null } }
官网: http://kotlinlang.org/docs/reference/nested-classes.html
大神翻译:https://github.com/huanglizhuo/kotlin-in-chinese/blob/master/ClassesAndObjects/NestedClasses.md
最后
很早以前看过一点kotlin,只是简单的看了下。这次写的东西,让我对Kotlin有了一个更深点的理解。
上面的内容,仅仅是这个列表用到的。还有很多如when,Ranges,枚举等等很多东西,有兴趣的可以自己看看官网,或者大神翻译的中文网站。
官网: http://kotlinlang.org/docs/reference/
大神翻译: https://github.com/huanglizhuo/kotlin-in-chinese
作者:笨鸟-先飞