写在前面:
几年前因为工作需要从一个渣渣Java后端开发(别误会,哈哈,是说我自己当时的水平渣渣)转到了前端Android开发。那会老板发话了,给你个公司内部的项目自己练手去吧,赶紧搞好,学会了开始接客(之前的公司是外包嘛)。当时就琢磨着可以把自己自学Android的经过能写下来,但是实在没经住后来客人实在太多了,在一个又一个敷衍出的外包项目中,我就这样又删了当初建的自学分组。最近,抽出时间自学Kotlin,又想起了当初没干的事,琢磨着怎么着也得补一发。这是第一次写系列的文章,有啥不如,各位看官还请担待点,多多给小的提意见
关于Kotlin:
Kotlin,它是JetBrains开发的基于JVM的语言。JVM是啥?这.....(这都不知道,确定不是来逗我的),JetBrains可能很多人不认识,但是它的另一个产品大家肯定是知道的,没错,就是Android Studio!官方的Android IDE!
Kotlin是兼容Java的,但是它比Java更安全(比如:空安全),更简洁(这点就慢慢感受吧,岂止是少写了几行代码那么简单吗?)。
关于Kotlin说了这么多冠冕堂皇的话是不是觉得看不下去了?抱着试一试态度的人是不是这会更关心学习Kotlin的成本和难度?好吧,如果你是一名有Java开发基础的攻城狮,那它真的....很简单~!不信吗?跟我一起来试一试吧!
环境搭建:
Android使用Kotlin的开发环境主要还是在Android Studio上,如果还有在使用Eclipse的童靴,Kotlin也是可以的,但是听说有很多的不足,具体的就自己尝试吧!本文,只针对Android Studio。
Android Studio 3.0+的版本将支持Kotlin的,可以直接下载使用。
如果是3.0之前的AS,也是可以通过插件的方式使用Kotlin的,具体方式如下:
现在我们的AS就可以理解Kotlin了,就和编译Java一样,编译运行Kotlin了。
创建项目:
使用Android studio新建一个项目(默认都是有过使用Android studio开发Android常识的)
如果你是AS3.0版本的,那么在新建的时候记得勾选Include Kotlin support,如图:
这样,新建项目完成后,大家会发现MainActivity的代码是这样的:
package com.lipeng.myapplication import android.support.v7.app.AppCompatActivity import android.os.Bundle class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
如果你不是3.0+的版本,那么就需要先配置一下Gradle了,配置需要修改整个项目的build.gradle和module的build.gradle。分别如下:
父类的build.gradle:
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext.kotlin_version = '1.1.2-4' //存储当前的Kotlin版本,可以根据实时变动 ext.anko_version = '0.8.2' //存储当前anko库的版本 repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() maven { url 'https://maven.google.com' } mavenCentral() } } task clean(type: Delete) { delete rootProject.buildDir }
module的build.gradle:
apply plugin: 'com.android.application' apply plugin: 'kotlin-android' //记得这两个东西o~ apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.lipeng.kotlintest" minSdkVersion 14 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } buildscript { repositories { jcenter() } dependencies { classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.0' testCompile 'junit:junit:4.12' compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" compile "org.jetbrains.anko:anko-common:$anko_version" //这库是一个用来简化Android任务的Kotlin库 }
配置完成后,MainActivity怎么办呢?Kotlin plugin提供了一个可以把Java代码转换为Kotlin的特性:
在MainActivity类中,code > Convert Java File to Kotlin File。
好啦,一切准备就绪,是不是已经迫不及待运行了呢?别着急,我们做点有趣的改动,初步认识一下kotlin的简洁!
输出“这真是美好的一天”:
(注:后续的所有示例都在AS3.0上完成)
我们在activity_main.xml中给默认的TextView增加一个ID:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.lipeng.kotlinstudy.MainActivity"> <TextView android:id="@+id/tv_hello" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </android.support.constraint.ConstraintLayout>
然后我们在MainActivity中这样:
package com.lipeng.kotlinstudy import android.app.Activity import android.os.Bundle import kotlinx.android.synthetic.main.activity_main.* class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) tv_hello.text="这真是美好的一天" } }
是不是觉得很茫然,注意:
import kotlinx.android.synthetic.main.activity_main.*
对的,然后你就可以再Activity直接通过id使用view了,就这样简单,findViewById是什么鬼?
至于.text="这真是美好的一天"就相当于Java中的:tv_hello.setText("这真是美好的一天");,因为Kotlin和Java的互操作性,Kotlin是像操作属性一样,去操作Java库中的getter/setter方法。可以使用tv_hello.text代替tv_hello.setText,而且这样使用是没有任何性能开销的。具体的后续再说...
然后大家应该注意到一个地方,Kotlin中是不使用“;”的,是不是挺好,每次敲完都要小拇指点一下的习惯将离你远去。
还等什么,现在运行APP:这真是美好的一天
Kotlin学习记录(二)—— Kotlin的变量、属性、类、构造函数、继承、方法