2020-01-10 11:57:31 baidu_17619859 阅读数 14
  • 征服Kotlin视频教程

    该课程包括Kotlin开发环境搭建、Kotlin基础知识、类和接口、枚举类、扩展、泛型、函数、lambdas表达式、对象、标准API等。

    8152 人正在学习 去看看 李宁

一、绑定xml控件

Android中默认可使用以下语句绑定xml

var tv = findViewById<TextView>(R.id.tv)

 

二、集成绑定xml插件

apply plugin:'kotlin-android-extensions'

//Activity中直接使用

tv.text = "学习Kotlin插件"

 

三、关于Anko

代替xml的Anko不够成熟,虽然更加简洁,但是暂不支持实时预览,而且复杂界面画在主类中会影响代码美观,需要单独处理,暂不学习;

 

四、Kotlin相比Java语言特征总结

1.省略结尾;

2.:连接类型和对象

var name: String = " : 测试"

3.方法声明,返回类型写在最后

fun testFun(name: String): String {

return ""

}

4.继承和实现都可以通过 : 连接

5.使用.class可以两个 ::

var intent = Intent(this,MainActivity::class.java)

6.实例化对象不需要new

var list:List<String> = ArrayList<String>()

7.变量和常量都可以用var定义,同事kotlin支持类型推理,即可以省略其类型,但需要强制赋值

var name: String = ":测试"

8.?表示可以为空;!!表示不可以为空,实用对象或函数的声明

//三种对声明变量是否可以为空的例子

val v1 = name?.toInt() //可以为空

val v2 = name?.toInt() ?: 0 //为空是返回0

val v3 = name!!.toInt() //为空就抛出异常

9.Unit相当于Java中的void,也可省略Unit,即默认返回void

10.is相当于instance of,in表示区间和集合(in在遍历时功能强大,可以指定遍历步长,可以指定起始位置,也可以指定正序或者倒叙,也可以反转对象),..表示区间

var v4: Int = 3

if (v4 in 1..5) {

}

11.when取代了switch,而且十分强大,同时支持各种类型的判断

12.Any类型相对于Java中的基类Object

13.对于实体类,省去set、get以及toString等方法

2017-05-19 16:13:35 youshi520000 阅读数 217
  • 征服Kotlin视频教程

    该课程包括Kotlin开发环境搭建、Kotlin基础知识、类和接口、枚举类、扩展、泛型、函数、lambdas表达式、对象、标准API等。

    8152 人正在学习 去看看 李宁

前言:

最近Kotlin一定是程序员(尤其是Android开发们)间最热传的事儿了,Google IO大会钦定Kotlin为Android开发的官方语音,想必Kotlin火起来也只是时间问题了。恰好最近工作不忙,就抽时间来研究一下,同时在此写个博客记录一下,希望自己可以坚持下来。废话不说,下面开始。


首先,环境配置

Android studio 3.0 preview自带支持Kotlin,所以如果有兴趣可以直接去下载个preview安装使用,预览版可以与稳定版共存,需要一些小操作,具体操作在Google下载页有介绍。点击这里

3.0以下版本想使用Kotlin也是可以的,安装个插件就好。具体方法如下图:
Preferences>Plugins(Mac)Preferences>Plugins(Mac)
搜索Kotlin并安装搜索Kotlin并安装
安装完成后需要重启AS。环境配置完成。


第二波,Hello Kotlin4Android

AS 3.0 proview我们可以直接new一个Kotlin项目,如下图:
勾选include Kotlin support勾选include Kotlin support
AS 3.0以下也没关系,可以在项目里创建Kotlin相关文件,然后应用到整个项目或个别modules。如下图:
随便选择一个Kotlin相关文件创建随便选择一个Kotlin相关文件创建
创建后会提示configure,这里看情况选择创建后会提示configure,这里看情况选择
等待bulid完成。

强烈建议要配置的东西,用于省略findViewById()直接使用控件id等快捷代码:

apply plugin: 'kotlin-android-extensions'

这里推荐添加anko库,具体功能介绍参见GitHub。总之很有用,加上就是。

dependencies {
    ......
    // Anko
    compile 'org.jetbrains.anko:anko-sdk19:0.10.0' // sdk19, sdk21, sdk23 are also available
    compile 'org.jetbrains.anko:anko-appcompat-v7:0.10.0' // For appcompat-v7 bindings
    compile 'org.jetbrains.anko:anko-support-v4:0.10.0' // In case you need support-v4 bindings
    ......
}

建议将kotlin和java区分开,在建一个一样的包,如图:区分java和kotlin
需要注明kotlin路径:

android {
    ......
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin' // 注明Kotlin路径
    }
    ......
}

配置结束,下面开始撸代码吧。

首先说几点,kotlin语法和java很像,用到了很多Lambda表达式。关于Lambda,我自己以前用的也很少,也没理解,不做解释。但个人觉得,kotlin和js看起来还是有一定相似之处的。kotlin语法中换行不用写分号,同行需要写分号分割语句。kotlin相比java,代码上实在是简洁了太多。各种优点网上随便搜出一大堆文章,当然很多都是一样的。

下图,我已经创建了kotlin文件夹并注明了路径,包名和java下的相同,这里新建了Kotlin Activity,KotlinMainActivity.kt。注意看可以发现kotlin文件的图标有个K样式的下标。
这里写图片描述
在Manifest中将入口指向为KotlinMainActivity。

KotlinMainActivity.kt:

package com.parfois.hellokotlinandroid

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class KotlinMainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        textview.text = "Hello Kotlin4Android!"
    }
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />

</LinearLayout>

以上是kotlin代码设置textview文本,而如果是java,我们要这样写:

 TextView textview =(TextView) findViewById(R.id.textview);
 textview.setText("Hello Kotlin4Android!");

看起来只是2行变成了1行。但这样理解一下,Java是先找到控件,强转成TextView类型,赋值给textview变量,然后setText。而Kotlin,直接就是给textview.text赋值。这里暂且不管这两者底层实现的异同,作为程序员,我们要做的事情,从4步(Java)变成了1步(Kotlin)。

是不是很diao炸天?

还有更多类似的简洁的地方。比如点击事件:

        //kotlin 代码
        textview.setOnClickListener { Log.i("log", "触发点击事件") }
        textview.setOnClickListener { v -> Log.i("log", "触发点击事件--控件id=" + v.id) }


        // java 代码
        textview.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("log", "触发点击事件");
            }
        });
        textview.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("log", "触发点击事件--控件id=" + v.getId());
            }
        });

还有个特别好用的功能,函数扩展,我们新建kt文件,上面我已经创建好了,Tools.kt:

package com.parfois.hellokotlinandroid

import android.content.Context
import android.widget.Toast

/**
 * Created by parfoismeng on 2017/5/19.
 */
fun Context.toast(msg: String) {
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()
}

Kotlin中,上面这样写是全局生效,所有Context类中都可以使用该函数。如果包装在class里,则只在该class生效。调用示例:

        textview.setOnClickListener { toast("这是toast") }

目前就先这些,上面引入的anko并没有介绍到,下一篇说一下如何不用xml编辑布局,直接在代码中使用anko书写布局。

以上。

2017-05-25 11:32:16 jinkui 阅读数 515
  • 征服Kotlin视频教程

    该课程包括Kotlin开发环境搭建、Kotlin基础知识、类和接口、枚举类、扩展、泛型、函数、lambdas表达式、对象、标准API等。

    8152 人正在学习 去看看 李宁

kotlin-android-extensions用于扩展绑定关系,为了解决findViewById()的问题。

背景

Android开发中,findViewById()是比较烦人的一个函数,开源界已经有几个库提供了解决办法,比如:ButterKnife,DataBinding等。

kotlin-android-extensions插件提供了一种方便的解决办法, 不用增加额外的代码,直接使用xml中定义的android:id就可以引用view, 例如:

// Using R.layout.activity_main from the main source set
import kotlinx.android.synthetic.main.activity_main.*

class MyActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView.setText("Hello, world!")
        // Instead of findView(R.id.textView) as TextView
    }
}

配置

  • 项目的 build.gradle 添加依赖
    classpath “org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version”
  • app 的 build.gradle 使用插件
    apply plugin: ‘kotlin-android-extensions’
  • 在代码开头 import 布局文件的属性
    import kotlinx.android.synthetic.main..*

示例

布局文件res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView android:id="@+id/message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</android.support.constraint.ConstraintLayout>

下面,使用两种方式写MainActivity。

  • 使用findViewById()
class MainActivity : AppCompatActivity() {
    private var mTextMessage: TextView? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mTextMessage = findViewById(R.id.message) as TextView
        mTextMessage!!.setText("Hello world")
    }
}
  • 使用kotlin-android-extensions
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    private var mTextMessage: TextView? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        message.setText("Hello world");
    }
}

参考:Kotlin Android Extensions

2018-04-09 01:37:34 renyuzhuo0 阅读数 881
  • 征服Kotlin视频教程

    该课程包括Kotlin开发环境搭建、Kotlin基础知识、类和接口、枚举类、扩展、泛型、函数、lambdas表达式、对象、标准API等。

    8152 人正在学习 去看看 李宁

前言

具体 Kotlin 是什么?我相信你已经在网络上其他地方看到过解释,这里不再赘述,简单一句话:“Kotlin 是一种与 Java、C++ 平级的函数式编程语言”。在上一篇文章中,我们应该看到了,Kotlin 有很多的基础特殊的语法,让代码变得简单清晰 (可能在开始的时候你反而觉得变得复杂了),但 Kotlin 真的就是语法的改变吗?花两个小时看看 Kotlin 的语法就算学完了 Kotlin 吗?非也!Kotlin 与 Java 最大的区别是 Kotlin 的函数式编程,这一点以后我们会经常提到,Kotlin 的核心与 Java 就有本质的不同。Kotlin Koans 是学习 Kotlin 极好的学习资料,我们先把 Kotlin Koans 做一遍,相信你会对 Kotlin 有完全不同的认识。

Kotlin Koans 项目详解

Kotlin Koans 是一个 Kotlin 学习的教程,采用的方式是给你未完成的代码,给你一点提示,你去补全代码,运行单元测试,通过后进入下一题,可以非常好的学习 Kotlin。

Kotlin Koans 的安装,可以在 GitHub 上下载源代码项目,但是我不建议这样做,我建议的方式是安装 EduTools 插件,安装方式是直接在插件中心中搜索 EduTools 就可以了:

图片

然后重启 Android Studio。可以看到第一项 Browse Courses:

图片

点击选择 Kotlin Koans 项目:

图片

大约需要一分钟后,会创建项目:

图片

感觉提示,完成第一个任务:

图片

这个任务就是上一篇中函数的定义相关的内容,我们可以看到得到如下一些信息:

  1. Kotlin 文件后缀为 .kt
  2. Kotlin 文件不需要定义类,可以直接定义方法
  3. 简单的方法可以省略大括号,直接在 = 后写返回值

每一个 Task 详解

Task 2:Java to Kotlin conversion

图片

将 Java 代码转换成 Kotlin 写法。我们打开 JavaCode.java 文件,选中 toJSON 方法,复制,到 Task.kt 中粘贴(粘贴需要选中代码),粘贴后可以发现 Java 代码自动转换成了 Kotlin 代码,很方便。

图片

图片

除了上面这种方法,还可以用 Android Studio 中代码装换工具,将 Java 文件转换成 Kotlin:

图片

图片

我们在这里注意几个问题:

  1. 函数的定义,用 fun 关键字
  2. 参数先写参数名,再写参数类型,中间用冒号 : 分割
  3. 方法参数后和大括号中间需要写函数返回值类型,用 : 说明
  4. 创建对象没有 new 关键字,直接类名后跟括号创建新对象
  5. 属性定义用 val(不可更改) 或 var(可以更改)

Task 3:Named arguments

图片

Kotlin 中参数是可以有默认值的,并且在调用的时候,可以显示声明哪些变量用哪些值,而不一定必须要按顺序赋值,其他的值使用默认值,很方便灵活,这样就可以减少构造函数、重载函数的数量。Java 中两个重载函数参数的类型如果都一样的话,是不允许的,但是 Kotlin 使用默认值的方式就可以很好的避免这个问题(声明一个三个参数的方法,并加上默认值,调用的时候对不同的参数进行声明赋值,就可以达到 Java 需要多个不同类型从在才能达到的目的)。

/**
 * Creates a string from all the elements separated using [separator] and using the given [prefix] and [postfix] if supplied.
 *
 * If the collection could be huge, you can specify a non-negative value of [limit], in which case only the first [limit]
 * elements will be appended, followed by the [truncated] string (which defaults to "...").
 */
public fun <T> Iterable<T>.joinToString(separator: CharSequence = ", ", prefix: CharSequence = "", postfix: CharSequence = "", limit: Int = -1, truncated: CharSequence = "...", transform: ((T) -> CharSequence)? = null): String {
    return joinTo(StringBuilder(), separator, prefix, postfix, limit, truncated, transform).toString()
}

图片

Task 4:Default arguments

图片

看题目可以看出,有些方法在调用的时候报错,提示有些值没有别赋值,那我们的任务就是在函数定义的时候加上合适的默认值,分析提示给出的 Java 代码,我们可以看到,最后一个如果 number 没有被赋值,会用默认值 42 调用第二个方法,而第二个方法 toUpperCase 没有被赋值,使用默认值 false 调用第一个方法,则可以写出答案:

图片

图片

在这里我们可以看到合理的使用默认值,可以极大的简化代码。

Task 5:Lambdas

图片

找偶数很简单,每一个都分别除 2 看余数是否为 0,但是刚刚看到这道问题可能会摸不着头脑,怎么写,这什么意思呀?题目名称叫 Lambdas,Java 8 中支持 Lambda 表达式,Kotlin 也同样支持,怎么写呢。如果想解决这个问题,我们最好解决几个概念:

  • 函数在 Kotlin 中是一等公民(First-class function)
    • 函数可以像变量一样传递给其他函数作为参数(某一个函数有参数,这个参数是一个变量)
    • 函数可以作为其他函数的返回值
    • 函数可以用于给变量赋值可以存储在数据结构中
  • 高阶函数(Higher-Order Functions)
    • 函数作为函数的参数
    • 函数作为函数的返回值
  • 函数式编程(Functional programming)
    • 函数式编程是和面向对象、面向过程同一级别的编程方法或编程模式
    • 函数是一等公民是函数式编程的必要条件,经常用在高阶函数中
    • 后面我们会有单独的文章介绍函数式编程

图片

我们可以看到 any 函数的定义,predicate 参数是一个函数,这个函数的返回值是一个 Boolean 类型的值:

图片

图片

图片

图片

简化到最后,就很简单了。有没有觉得函数式编程特别神奇呢?

Task 6:Strings

图片

Kotlin 字符串可以像 Java 一样,也可以用三个双引号声明,三个双引号声明的字符串其中可以包含多行。字符串模板可以很方便在字符串中使用变量,则这个题的答案就是:

图片

这里我们用了 trimIndent() 方法对缩进进行格式化,还可以使用 trimMargin(),如下图,其中的竖线 | 是trimMaring 默认格式化特殊字符:

图片

Task 7:Data classes

图片

Date Class 是什么东西?我们先来了解 Kotlin 中集中数据结构:

  • Class
    • 与 Java 类类似,是一种数据结构
    • Kotlin 中的 Class 继承自 Any,而不是 Object
    • 用关键字 constructor 声明构造函数,够着函数可以有默认值
    • 构造函数分为主构造函数和二级构造函数,主构造函数跟在类名后由关键字 constructor 和参数表共同构成,二级构造函数在类中,用 constructor 和参数列表构成,注意如果有主构造函数,二级函数必须调用主构造函数。如 constructor(name: String, parent: Person) : this(name)
    • 主构造函数无法执行代码,如果需要执行一些代码时,可以用 init{} 在类中执行,可以声明多个 init{},执行顺序与声明顺序一致。
    • 默认类不可以被集成,方法不可以被重写,如果希望类被继承或方法可以被重写,可以在类或方法前加 open 关键字。
    • 子类在重写父类方法时,需要在方法前加 override 关键字
    • super 关键字调用父类方法
    • abstract 关键字定义抽象类,interface 关键字定义接口。
    • 普通情况下,类没有静态方法,如果需要静态发发或所有静态属性,需要用伴随对象 companion object,相当于独立于类开辟了一块空间,所有对象共有。
  • Properties and Fields
    • val 修改不可更改的属性
    • var 修饰可以更改的属性
    • lateinit 修饰延迟加载的属性,在需要用的时候才初始化。
  • Data Class
    • 有些时候,创建类就是为了让其可以有几个属性,Java 中的 Bean 对象,而在 Kotlin 中,将这种数据结构单独定义为 data class
    • 其中会自动创建一些方法,如 copy()equals()
    • 我们在后面会有主题讲解 data class

图片

data class 可以很简单的定义数据结构,并且其中自动包含了 get/set 方法,易读且方便。

Task 8:Nullable type

图片

Java 中经常需要判空,如果不为空,获取其中某些属性值等,写起来不优雅,且不安全,Kotlin 中采用了更简单的方式。

图片

注意,这并不意味着 Kotlin 中就完全不需要关心变量为空引起的错误,我们后面会具体详细说明一些 Java 代码转成 Kotlin 或直接 写 Kotlin 代码引起的一些错误,是一个需要填的坑。

Task 9:Smart casts

图片

自动类型转换是一个很聪明的特性。Kotlin 中没有 switch-case,代替它的是 when,这里的例子是判断 expr 具体是哪一种类型,这里可以展现出 Kotlin 强大的是在判断一个对象是哪一种类型后,后面这个变量直接转换成该类型,而不像 Java 中需要强转。

图片

Task 10:Extension functions

图片

扩展函数。有些时候,某些类功能不够强大,你希望扩展这个类,而你又不能修改该类的源代码,如果是 Java,你可能需要继承自功能不够强大的类,添加新方法,然后使用新的类,这比较麻烦,也可能会因为需求的变更,这个类越来越不好维护。Kotlin 的方式是在不修改原来的类的代码的情况下,扩展方法出新的方法,使用起来就像是在原来的类中添加了新的方法。

图片

在没有修改 Int 和 Pair 对象的情况下,他们都有了转成有理数的方法了。

Task 11:Object expressions

图片

对象表达式。Kotlin 的对象表达式与 Java 中的匿名内部类差不多。有些情况只用一次的对象,没必要写成一个类。

图片

简化代码改为 Lambda 表达式:

图片

再简化代码,使用 Kotlin stdlib:

图片

了解越多 Kotlin stdlib 中的方法,写代码越快,效率越高。

Task 12:Extension functions on collections

Kotlin 在集合类中做了大量的优化,提供了大量的有用的方法,这里排序可以直接调用。

/**
 * Returns a list of all elements sorted descending according to their natural sort order.
 */
public fun <T : Comparable<T>> Iterable<T>.sortedDescending(): List<T> {
    return sortedWith(reverseOrder())
}

Kotlin 提供了自然序的升序降序排序方法:sortedDescending

图片

Task 13:Comparison

图片

我们定义了一个类 MyDate,我们现在直接用 < 对这个类的对象比较大小。我们需要对这个对象定义比较大小操作符,则只需重写 compareTo 方法就可以了。

图片

Task 14:Task In range

图片

有了上面的经验,这里只需了解 in 操作符是调用的 contains 方法就可以了:

图片

简写成(其中 .. 就是执行 rangeTo 方法):

图片

Task 15:Range to

图片

图片

图片

我们在上一个任务中,有编译器自动提示使用了 in - .. 操作符,我们点进去看看,发现其实就是执行了 rangeTo 方法,这一个任务中,我们就需要实现 rangeTo 方法就可以,rangeTo 方法返回值是 ClosedRange,而 ClosedRange 需要对象实现比较大小 compareTo 方法,恰好我们上一节中已经在 MyData 中实现了 compareTo,恰好 DateRange 实现了 ClosedRange,因此我们可以直接使用,结果如下:

图片

这个任务比较复杂,但是逻辑是很清晰的。

Task 16:For loop

图片

For 循环需要迭代器,DateRange 需要实现 Iterable,则问题就简单了:

图片

当然,可以优化代码:

图片

For 循环就是迭代器的遍历。

Task 17:Operators overloading

图片

+ 操作符,其实就是实现 plus 方法。* 操作符就是实现 times 方法

图片

Task 18:Destructuring declarations

图片

可以将对象属性值赋值给其他对象,要求这个对象必须由 data 修饰。

图片

Task 19:Invoke

图片

图片

小结

本文主要了解了一些 Kotlin 的具体实现方法,对真正写 Kotlin 程序极有好处。

到这里,我们完成了一半的任务,为避免篇幅过长,下面的任务我们在下一篇文章中继续讨论。


如果有一天你觉得过的舒服了,你就要小心了!欢迎关注我的公众号:我是任玉琢

qrcode_for_gh_45402a07f7d9_258

2017-06-23 15:01:07 yjp19871013 阅读数 599
  • 征服Kotlin视频教程

    该课程包括Kotlin开发环境搭建、Kotlin基础知识、类和接口、枚举类、扩展、泛型、函数、lambdas表达式、对象、标准API等。

    8152 人正在学习 去看看 李宁

最新更新:

1.之前用该方法创建的项目,在Android Studio3.0上可以正常运行,配置方法应该同样可用。


参考过各色资料后,自己配置,发现只需要三步:


1.在app下的build.gradle中开头添加

apply plugin: 'kotlin-kapt'


2.在app下的build.gradle中android下添加

dataBinding {
    enabled = true
}


3.在app下的build.gradle中dependencies下添加

kapt "com.android.databinding:compiler:2.3.3"


其中版本号2.3.3可参照module下的build.gradle的,实际上就是Android Studio的版本

classpath 'com.android.tools.build:gradle:2.3.3'


没有更多推荐了,返回首页