Kotlin(一)

写在前面:

  • 参考资料:

《Kotlin官方文档》《Kotlin for Android 开源中文版》

  • 准备工作:

Android-Studio2.x:添加Kotlin扩展插件,3.x默认支持Kotlin,开箱既得

添加项目依赖(app下的build gradle)

exclude group: 'com.android.support', module: 'support-annotations'
})
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
compile('com.github.VictorChow:KotlinAndroidLib:0.1.0') {
    transitive = false
}
compile "org.jetbrains.anko:anko-sdk15:0.9.1" // So here it's 15 too
compile "org.jetbrains.anko:anko-appcompat-v7:0.9.1"
compile "org.jetbrains.anko:anko-design:0.9.1"
compile "org.jetbrains.anko:anko-recyclerview-v7:0.9.1"   

关于Anko库:Anko是JetBrains开发的一个强大的库。它主要的目的是用来替代以前XML的方式来使用代码生成UI布局:例如Toast:toast(“This is a Toast”)即可

基础语法:

基本语法

数据类型及关键字参见官方文档及资料

val:局部常量:必须在定义的时候赋初始值

var:局部变量

静态变量或常量以及方法:类比java中的static关键字

companion object:伴生对象(或者理解为陪伴类一生的对象?)
在companion object {
    //静态变量
        private var name: String?= null
       //静态方法
        fun initName(name1:String?): String?{
            this.name = name1
    }
}

量的定义:

1.lateinit var name:String(lateinit var: kotlin软关键字:此处表示对变量在后期再进行初始化工作)
2.var name:String = "xxx"(这种定义方式必须赋值,且不能为null)
3.var name:String? = null (类比上一种,可以赋值怒null,注意?这个符号,这是Kotlin语言的一个重要符号,可以理解为:允许为空值,后面还会遇到)
4.val name:String = "xxx"(val关键字修饰的常量,必须在定义时初始化)

方法定义或其他

1.fun method(参数:参数类型):(返回值:返回值类型){方法体}
2.override fun onCreate(参数表){}      //override重写关键字,此处即重写onCreate(参数表)方法
3.静态方法:见上文

类型转换

1.toString()等方法
2.as关键字:Java中:textView:TextView = (TextView)findViewbyId(R.id.xxx)
            Kotlin中:textView = findViewbyId(R.id.xxx) as TextView
            或者有使用Anko:textView = find(R.id.xxx)as TextView

类的继承和接口的实现

A,B为类,C为接口

java:
class A extends B implements C

kotlin:
class A: B , C

构造方法

1.默认构造方法:

class myAdapter(val context: Context,var isCollect:Boolean): RecyclerView.Adapter<MyViewHolder>() {}
主构造方法(或者称为默认构造方法)紧跟在类名后面(参数表中定义的变量或者常量,类似于java中在类中的普通变量或者常量,无需在类中再次定义)。
或者:
class myAdapter: RecyclerView.Adapter<MyViewHolder>() {
//这是第二种写带参主构造方法的写法
    constructor(val context: Context) {}
//这是第三种写带参主构造方法的写法
    constructor(val context: Context):super(context){}
}

2.次构造方法:

class myAdapter(val context: Context,var isCollect:Boolean): RecyclerView.Adapter<MyViewHolder>() {

    lateinit var storiesList: List<ThemesItemsBean.StoriesBean>

    constructor(context: Context , themesItemsBean: ThemesItemsBean,isCollect: Boolean) : this(context,isCollect){
        storiesList = themesItemsBean.stories
    }
次构造方法:使用constructor(参数表):this(默认参数表(必须要有)){方法体}
}

构造方法注意点:constructor软关键字可声明主次构造方法,但是主构造方法不能加(:this(默认参数表),主构造方法可后接:super(参数)),次构造方法不能少(:this(默认参数表))

实际代码中遇到的一些坑

1.添加和切换fragment:

java中:
transaction = FragmentManager.beginTransaction()
再通过这个transaction来实现添加或者隐藏显示fragment
kotlin中:
val transaction: android.support.v4.app.FragmentTransaction = supportFragmentManager.beginTransaction()
注意这里的supportFragmentManager虽然方法中也有提示Fragment,但在实际使用中,会出现参数表不匹配的错误导致无法添加成功

2.Actionbar的使用:

在java中:
    setSupportActionBar(ToolBar)
    ActionBar actionBar = getSupportActionBar()
    actionBar.setTitle("xxxxxx")
在kotlin中:
   setSupportActionBar(ToolBar)
   supportActionBar?.setTitle("xxxxxx")

3.Anko的find方法在ViewHolder类中使用报错:

貌似是null can not cast to non-null:

原来的使用方法是:
var textView = itemView.find(R.id.xxx) as TextView
解决办法(查找自StackOverFlow):
var textView = itemView.findViewById(R.id.xxx) as? TextView

4.关于List< ClassType>

不同于java,kotlin语言一大优势就在于更好的处理null异常,而这里的List<>,在kotlin中是没有提供诸如add,set等方法的,只是默认提供了get和其他一些只读操作方法

var storiesList:List<StoriesBean> = ArrayList<StoriesBean>()
这种写法无法在代码中使用storiesList.add(xxx)(不会出现add()方法)
//解决办法:
var storiesList:MutableList<StoriesBean> = ArrayList<StoriesBean>()
storiesList.add(xxx)(这样才能正常add或者set)

Kotlin(一)的更多相关文章

  1. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

    作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...

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

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

  3. Kotlin与Android SDK 集成(KAD 05)

    作者:Antonio Leiva 时间:Dec 19, 2016 原文链接:https://antonioleiva.com/kotlin-integrations-android-sdk/ 使用Ko ...

  4. Kotlin的android扩展:对findViewById说再见(KAD 04)

    作者:Antonio Leiva 时间:Dec 12, 2016 原文链接:http://antonioleiva.com/kotlin-android-extensions/ 你也许已厌倦日复一日使 ...

  5. Kotlin类:功能更强、而更简洁(KAD 03)

    作者:Antonio Leiva 时间:Dec 7, 2016 原文链接:http://antonioleiva.com/classes-kotlin/ Kotlin类尽可能简单,这样用较少的代码完成 ...

  6. Kotlin中变量不同于Java: var 对val(KAD 02)

    原文标题:Variables in Kotlin, differences with Java. var vs val (KAD 02) 作者:Antonio Leiva 时间:Nov 28, 201 ...

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

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

  8. Android的Kotlin秘方(II):RecyclerView 和 DiffUtil

    作者:Antonio Leiva 时间:Sep 12, 2016 原文链接:http://antonioleiva.com/recyclerview-diffutil-kotlin/ 如你所知,在[支 ...

  9. Android的Kotlin秘方(I):OnGlobalLayoutListener

    春节后,又重新“开张”.各位高手请继续支持.谢谢! 原文标题:Kotlin recipes for Android (I): OnGlobalLayoutListener 原文链接:http://an ...

  10. KOTLIN开发语言文档(官方文档) -- 2.基本概念

    网页链接:https://kotlinlang.org/docs/reference/basic-types.html 2.   基本概念 2.1.  基本类型 从可以在任何变量处理调用成员函数和属性 ...

随机推荐

  1. SpringMVC控制器方法参数传入的ModelMap 和Model类型有啥区别

    参考 http://blog.csdn.net/u013067598/article/details/69372309 http://blog.csdn.net/u013686993/article/ ...

  2. i++与++i区别

    ++i:先执行i加1,再执行语句; i++:先执行语句,再i加1; 后置自操作:先把自己所保存的值留下来,然后改变自己,自己给别人的值是原来的值: 前置自操作:先把自己改变,然后把改变后的值给别人. ...

  3. C#设计模式(12)——享元模式(Flyweight Pattern)(转)

    一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非 ...

  4. 细说flask数据库迁移

    什么情况下要用数据库迁移? 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化 ...

  5. Linux进程相关命令使用场景

    Linux进程相关命令使用场景 在Linux系统上工作时,我们常常会碰到很多和进程相关的查询场景,今天在这里进行详细的讲解,进程相关的对象包括以下几个: 端口:Port 进程号:PId 执行文件所在路 ...

  6. DIV层的使用方法

    1.可以判断你选择的样式是否存在用下边的方法(如果存在的话执行某个方法) if ($(this).hasClass('cur')) 2.这个方法可以查询一个页面中同样的div层总共有几个 var i= ...

  7. Template模板

     目标 模板介绍 模板变量 常用标签 常用过滤器 自定义过滤器 模板结构 加载静态文件 一 模板介绍 在之前的章节中,视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面大多是带 ...

  8. 51Nod 博弈模板题

    连刷3道博弈模板题,算是稍微学习了以下三个经典博弈了.推荐一个博客. 第一道模板:Bash博弈——同余理论 1066 Bash游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度 ...

  9. Docker Compose 创建yml 简单试例

    Docker Compose 创建yml 简单试例 Docker Compose 文件使用格式版本需要与Docker版本对应可在官网内查找 查找地址:https://docs.docker.com/c ...

  10. angular7 DOM操作 及 @ViewChild

    一.Angular 中的 dom 操作(原生 js) 二.Angular 中的 dom 操作(ViewChild) 三.父子组件中通过 ViewChild 调用子组件 的方法 1.调用子组件给子组件定 ...