Anko for Android

kotlin文章长路漫漫 发表了文章 • 0 个评论 • 292 次浏览 • 2017-07-24 18:29 • 来自相关话题

Anko 是一个使开发Android应用更简单更快捷的库,Anko使你的代码简洁易懂, 使开发者不用再在意Android SDK对Java版本的限制(目前还不支持Java8 =。= ).

Anko版本的 hello world :verticalLayout {
val name = editText()
button("Say Hello") {
onClick { toast("Hello, ${name.text}!") }
}
}上面的代码创建了一个Button,放在 LinearLayout 内, 并为其设置了一个点击监听器OnClickListener .



上面是一个DSL(Domain Specific Language),使用的是 Kotlin语言.

DSL,即 Domain Specific Language,领域相关语言。什么是 DSL,说白了它就是某个行业中的行话。

Why Anko?

为啥 DSL?

平时开发android, UI写在xml中,这就导致了下面的几个问题 :
It is not typesafeIt is not null-safeIt forces you to write almost the same code for every layout you makeXML is parsed on the device wasting CPU time and battery 渲染xml为对象过程耗时耗电Most of all, it allows no code reuse. 大部分不能重用
 但是全部只在代码中写UI,这很难,不仅代码丑,而且冗余难维护,下面是 Ktolin版本的(Java甚至更长):val act = this
val layout = LinearLayout(act)
layout.setOrientation(LinearLayout.VERTICAL)
val name = EditText(act)
val button = Button(act)
button.setText("Say Hello")
button.setOnClickListener {
Toast.makeText(act, "Hello, ${name.getText()}!", Toast.LENGTH_SHORT).show()
}
layout.addView(name) layout.addView(button)
DSL 就不一样类,相同的逻辑,但简洁易懂, 易于编写而且没有运行开销(runtime overhead)看下面的代码:verticalLayout {
val name = editText()
button("Say Hello") {
onClick { toast("Hello, ${name.text}!") }
}
}为啥不用 Scaloid?

Scaloid 是一个类似与 Scala 的库, 有很多非常酷的特性可供 Scala 开发者使用. Anko主要是针对 Java 和 Kotlin developers.

兼容已有的代码

不需要用Anko重写所有的UI, 你可以保留原有的Java代码. 此外, 如果你想写一个 Kotlin的activity类并且由于某些需求需要使用 inflate来渲染xml, 你完全可以按照原来的写法:// Same as findViewById(), simpler to use
val name = find<TextView>(R.id.name)
name.hint = "Enter your name"
name.onClick { /*do something*/ }
工作原理

There is no :tophat:. Anko 由一些 Kotlin的 扩展函数和属性,被设置成类型安全(type-safe builders)的, under Type Safe Builders.

他们繁琐的手工编写所有这些扩展, 使用Android SDK的源码中的 android.jar 文件自动生成

可扩展吗?

答案是: yes.
例如. 你可能想使用 MapView 在DSL中.你可以编写下面的代码(kotlin文件中),然后就可已到处使用了public inline fun ViewManager.mapView() = mapView {}
public inline fun ViewManager.mapView(init: MapView.() -> Unit): MapView {
return ankoView({ MapView(it) }, init)
}
{ MapView(it) } 是你自定义View的一个工厂方法View. 接受一个 Context .frameLayout {
val mapView = mapView().lparams(width = matchParent)
}如果你想创建一个 顶级的 DSL,看这里Extending Anko.

使用 Gradle

这里有个例子 template project 展示类如果在Android中Gradle配置.

基本上,你只需要配置 repository 和一个 compile dependency:dependencies {
compile 'org.jetbrains.anko:anko-sdk15:0.7.1' // sdk19, sdk21, sdk23 are also available
compile 'org.jetbrains.anko:anko-support-v4:0.7.1' // In case you need support.v4 bindings
}

当作 Jar library使用

加入你的项目不是基于Gradl, 不需要配置 Maven. 只要添加这里 的jar包即可.

编译 Anko

如何编译看under Building.

理解 Anko

Anko 是使用 Kotlin语言编写的.
如果不熟悉Kotlin看 kotlinlang.org.
Kotlin与Java很类似,所以很容易学.

基础

Anko中, 你不需要继承其他奇怪的类,只要标准的Activity, Fragment, FragmentActivity 或者其他任意的类

首先, 在使用Anko的DSL的类中导入 org.jetbrains.anko.* .

DSL 可以在 onCreate()中使用:override fun onCreate(savedInstanceState: Bundle?) {
super<Activity>.onCreate(savedInstanceState)

verticalLayout {
padding = dip(30)
editText {
hint = "Name"
textSize = 24f
}
editText {
hint = "Password"
textSize = 24f
}
button("Login") {
textSize = 26f
}
}
}
不需要显示的调用 setContentView(R.layout.something), Anko 自动为Activity(只会对Activity)进行 set content view

padding, hint 和 textSize 是 扩展属性. 大多数 View 具有这些属性,允许使用text = "Some text" 代替 setText("Some text").

verticalLayout (一个竖直方向的 LinearLayout), editText 和 button are
扩展函数. 这些函数存在与ANdroid 框架中的大部View中, Activities, Fragments ( android.support 包中的) 甚至 Context同样适用.

如果有一个 Context 实例, 可以写出下面的DSL结构:val name = with(myContext) {
editText {
hint = "Name"
}
}变量 name 成为了 EditText类型.

Helper 方法

你可能注意到了,前面章节中 button 方法接了一个字符串参数,这样的Helper方法同样使用与 TextView, EditText, Button , ImageView.

如果你不需要 View 其他的属性,你可以省略 {} 直接写 button("Ok") 或只有 button():verticalLayout {
button("Ok")
button("Cancel")
}Layouts 和 LayoutParams

在父布局中布局控件可能需要使用 LayoutParams. xml中长这样:<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android_layout_marginLeft="5dip"
android_layout_marginTop="10dip"
android:src="@drawable/something" />
Anko中, 在View的后面使用 lparams来实现类似与xml的 LayoutParams。linearLayout {
button("Login") {
textSize = 26f
}.lparams(width = wrapContent) {
horizontalMargin = dip(5)
topMargin = dip(10)
}
}如果指定了 lparams,但是没有指定 width 或者 height, 默认是 WRAP_CONTENT.但是你可以自己通过使用named arguments指定.

注意下面一些方便的属性:
horizontalMargin 同时设置 left 和 right margins,verticalMargin 同时设置 top 和 bottommargin 同时设置4个方向的 margins.

注意 lparams 的使用在不同的布局中是不同的, 例如在 RelativeLayout中:val ID_OK = 1

relativeLayout {
button("Ok") {
id = ID_OK
}.lparams { alignParentTop() }

button("Cancel").lparams { below(ID_OK) }
}Listeners

设置listeners:button("Login") {
onClick {
login(name, password)
}
}下面的效果一样:button.setOnClickListener(object : OnClickListener {
override fun onClick(v: View) {
login(name, password)
}
})当一个Listener有多个方法时,Anko就显得很方便类. 看下面的代码(没有使用Anko):seekBar.setOnSeekBarChangeListener(object: OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
// Something
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
// Just an empty method
}
override fun onStopTrackingTouch(seekBar: SeekBar) {
// Another empty method
}
})
使用了Anko:seekBar {
onSeekBarChangeListener {
onProgressChanged { seekBar, progress, fromUser ->
// Something
}
}
}如果你同时设置了onProgressChanged 和 onStartTrackingTouch , 两个方法将被合并. 对于多个相同的方法,最后的一个有效.

Resources, Colors 和 Dimensions

Using resource identifiers

前面的所有例子直接使用的 Java的字符串,但是大多数时候字符串都是放在 res/values/ 目录下,并且是运行时调用的,例如 getString(R.string.login).

幸运的是,Anko中可以使用以下两个 helper方法 (button(R.string.login)) 和 (button { textResource = R.string.login }).

注意,这些属性不是 text, hint, image, 而是 textResource, hintResource and imageResource.Resource properties always throw AnkoException when read. Colors

两个简单的扩展函数使代码更加易懂。






Dimensions

你可以指定 dimension 的 dip (density-independent pixels) 或 sp (scale-independent pixels)值: dip(dipValue) 或 sp(spValue). 注意 textSize属性默认接受sp (textSize = 16f). 使用 px2dip 和 px2sp 相互转换.

Instance shorthands

在Activity中,有时你需要传一个 Context实例给一个 Android SDK中的方法,通常你会写 this, 如果在内部类呢?你可能写SomeActivity.this ,如果你使用 Kotlin,你只需写 this@SomeActivity ,
使用 Anko,你可以只写 ctx. ctx是Activity 和 Service 或者 Fragment (使用的 getActivity() )内部的一个属性. 你也可以使用act扩展属性获取 Activity实例.

UI wrapper

开始使用Anko 之前,将 UI tag 作为 DSL 顶级元素:UI {
editText {
hint = "Name"
}
}这将更易于扩展 DSL ,因为你必须声明一个函数 ViewManager.customView.
看这里 Extending Anko 获取更多信息.

Include tag

使用 include tag 很容易向 DSL 插入 一个 XML layout :include<View>(R.layout.something) {
backgroundColor = Color.RED
}.lparams(width = matchParent) { margin = dip(12) }通常可以使用 lparams , 如果类型不是 View,仍然可以用 {}:include<TextView>(R.layout.textfield) {
text = "Hello, world!"
}Styles

Anko 支持 styling: style 是一个简单的函数,接受一个View, 效果作用于这个 View , 并且当这个View 是一个ViewGroup 时,可以可以递归的作用与 这个View的 child View:verticalLayout {
editText {
hint = "Name"
}
editText {
hint = "Password"
}
}.style {
view -> when(view) {
is EditText -> view.textSize = 20f
}
}

转自:http://www.jianshu.com/p/7cf5b42eb25









  查看全部
Anko 是一个使开发Android应用更简单更快捷的库,Anko使你的代码简洁易懂, 使开发者不用再在意Android SDK对Java版本的限制(目前还不支持Java8 =。= ).

Anko版本的 hello world :
verticalLayout {
val name = editText()
button("Say Hello") {
onClick { toast("Hello, ${name.text}!") }
}
}
上面的代码创建了一个Button,放在 LinearLayout 内, 并为其设置了一个点击监听器OnClickListener .



上面是一个DSL(Domain Specific Language),使用的是 Kotlin语言.

DSL,即 Domain Specific Language,领域相关语言。什么是 DSL,说白了它就是某个行业中的行话。

Why Anko?

为啥 DSL?


平时开发android, UI写在xml中,这就导致了下面的几个问题 :
  • It is not typesafe
  • It is not null-safe
  • It forces you to write almost the same code for every layout you make
  • XML is parsed on the device wasting CPU time and battery 渲染xml为对象过程耗时耗电
  • Most of all, it allows no code reuse. 大部分不能重用

 但是全部只在代码中写UI,这很难,不仅代码丑,而且冗余难维护,下面是 Ktolin版本的(Java甚至更长):
val act = this 
val layout = LinearLayout(act)
layout.setOrientation(LinearLayout.VERTICAL)
val name = EditText(act)
val button = Button(act)
button.setText("Say Hello")
button.setOnClickListener {
Toast.makeText(act, "Hello, ${name.getText()}!", Toast.LENGTH_SHORT).show()
}
layout.addView(name) layout.addView(button)
DSL 就不一样类,相同的逻辑,但简洁易懂, 易于编写而且没有运行开销(runtime overhead)看下面的代码:
verticalLayout {
val name = editText()
button("Say Hello") {
onClick { toast("Hello, ${name.text}!") }
}
}
为啥不用 Scaloid?

Scaloid 是一个类似与 Scala 的库, 有很多非常酷的特性可供 Scala 开发者使用. Anko主要是针对 Java 和 Kotlin developers.

兼容已有的代码

不需要用Anko重写所有的UI, 你可以保留原有的Java代码. 此外, 如果你想写一个 Kotlin的activity类并且由于某些需求需要使用 inflate来渲染xml, 你完全可以按照原来的写法:
// Same as findViewById(), simpler to use 
val name = find<TextView>(R.id.name)
name.hint = "Enter your name"
name.onClick { /*do something*/ }
工作原理

There is no :tophat:. Anko 由一些 Kotlin的 扩展函数和属性,被设置成类型安全(type-safe builders)的, under Type Safe Builders.

他们繁琐的手工编写所有这些扩展, 使用Android SDK的源码中的 android.jar 文件自动生成

可扩展吗?

答案是: yes.
例如. 你可能想使用 MapView 在DSL中.你可以编写下面的代码(kotlin文件中),然后就可已到处使用了
public inline fun ViewManager.mapView() = mapView {} 
public inline fun ViewManager.mapView(init: MapView.() -> Unit): MapView {
return ankoView({ MapView(it) }, init)
}
{ MapView(it) } 是你自定义View的一个工厂方法View. 接受一个 Context .
frameLayout {
val mapView = mapView().lparams(width = matchParent)
}
如果你想创建一个 顶级的 DSL,看这里Extending Anko.

使用 Gradle

这里有个例子 template project 展示类如果在Android中Gradle配置.

基本上,你只需要配置 repository 和一个 compile dependency:
dependencies {
compile 'org.jetbrains.anko:anko-sdk15:0.7.1' // sdk19, sdk21, sdk23 are also available
compile 'org.jetbrains.anko:anko-support-v4:0.7.1' // In case you need support.v4 bindings
}

当作 Jar library使用

加入你的项目不是基于Gradl, 不需要配置 Maven. 只要添加这里 的jar包即可.

编译 Anko

如何编译看under Building.

理解 Anko

Anko 是使用 Kotlin语言编写的.
如果不熟悉Kotlin看 kotlinlang.org.
Kotlin与Java很类似,所以很容易学.

基础

Anko中, 你不需要继承其他奇怪的类,只要标准的Activity, Fragment, FragmentActivity 或者其他任意的类

首先, 在使用Anko的DSL的类中导入 org.jetbrains.anko.* .

DSL 可以在 onCreate()中使用:
override fun onCreate(savedInstanceState: Bundle?) {
super<Activity>.onCreate(savedInstanceState)

verticalLayout {
padding = dip(30)
editText {
hint = "Name"
textSize = 24f
}
editText {
hint = "Password"
textSize = 24f
}
button("Login") {
textSize = 26f
}
}
}
不需要显示的调用 setContentView(R.layout.something), Anko 自动为Activity(只会对Activity)进行 set content view

padding, hint 和 textSize 是 扩展属性. 大多数 View 具有这些属性,允许使用text = "Some text" 代替 setText("Some text").

verticalLayout (一个竖直方向的 LinearLayout), editText 和 button are
扩展函数. 这些函数存在与ANdroid 框架中的大部View中, Activities, Fragments ( android.support 包中的) 甚至 Context同样适用.

如果有一个 Context 实例, 可以写出下面的DSL结构:
val name = with(myContext) {
editText {
hint = "Name"
}
}
变量 name 成为了 EditText类型.

Helper 方法

你可能注意到了,前面章节中 button 方法接了一个字符串参数,这样的Helper方法同样使用与 TextView, EditText, Button , ImageView.

如果你不需要 View 其他的属性,你可以省略 {} 直接写 button("Ok") 或只有 button():
verticalLayout {
button("Ok")
button("Cancel")
}
Layouts 和 LayoutParams

在父布局中布局控件可能需要使用 LayoutParams. xml中长这样:
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android_layout_marginLeft="5dip"
android_layout_marginTop="10dip"
android:src="@drawable/something" />
Anko中, 在View的后面使用 lparams来实现类似与xml的 LayoutParams。
linearLayout {
button("Login") {
textSize = 26f
}.lparams(width = wrapContent) {
horizontalMargin = dip(5)
topMargin = dip(10)
}
}
如果指定了 lparams,但是没有指定 width 或者 height, 默认是 WRAP_CONTENT.但是你可以自己通过使用named arguments指定.

注意下面一些方便的属性:
  • horizontalMargin 同时设置 left 和 right margins,
  • verticalMargin 同时设置 top 和 bottom
  • margin 同时设置4个方向的 margins.


注意 lparams 的使用在不同的布局中是不同的, 例如在 RelativeLayout中:
val ID_OK = 1

relativeLayout {
button("Ok") {
id = ID_OK
}.lparams { alignParentTop() }

button("Cancel").lparams { below(ID_OK) }
}
Listeners

设置listeners:
button("Login") {
onClick {
login(name, password)
}
}
下面的效果一样:
button.setOnClickListener(object : OnClickListener {
override fun onClick(v: View) {
login(name, password)
}
})
当一个Listener有多个方法时,Anko就显得很方便类. 看下面的代码(没有使用Anko):
seekBar.setOnSeekBarChangeListener(object: OnSeekBarChangeListener { 
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
// Something
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
// Just an empty method
}
override fun onStopTrackingTouch(seekBar: SeekBar) {
// Another empty method
}
})
使用了Anko:
seekBar {
onSeekBarChangeListener {
onProgressChanged { seekBar, progress, fromUser ->
// Something
}
}
}
如果你同时设置了onProgressChanged 和 onStartTrackingTouch , 两个方法将被合并. 对于多个相同的方法,最后的一个有效.

Resources, Colors 和 Dimensions

Using resource identifiers


前面的所有例子直接使用的 Java的字符串,但是大多数时候字符串都是放在 res/values/ 目录下,并且是运行时调用的,例如 getString(R.string.login).

幸运的是,Anko中可以使用以下两个 helper方法 (button(R.string.login)) 和 (button { textResource = R.string.login }).

注意,这些属性不是 text, hint, image, 而是 textResource, hintResource and imageResource.
Resource properties always throw AnkoException when read. 
Colors

两个简单的扩展函数使代码更加易懂。

QQ图片20170724182516.png


Dimensions

你可以指定 dimension 的 dip (density-independent pixels) 或 sp (scale-independent pixels)值: dip(dipValue) 或 sp(spValue). 注意 textSize属性默认接受sp (textSize = 16f). 使用 px2dip 和 px2sp 相互转换.

Instance shorthands

在Activity中,有时你需要传一个 Context实例给一个 Android SDK中的方法,通常你会写 this, 如果在内部类呢?你可能写SomeActivity.this ,如果你使用 Kotlin,你只需写 this@SomeActivity ,
使用 Anko,你可以只写 ctx. ctx是Activity 和 Service 或者 Fragment (使用的 getActivity() )内部的一个属性. 你也可以使用act扩展属性获取 Activity实例.

UI wrapper

开始使用Anko 之前,将 UI tag 作为 DSL 顶级元素:
UI {
editText {
hint = "Name"
}
}
这将更易于扩展 DSL ,因为你必须声明一个函数 ViewManager.customView.
看这里 Extending Anko 获取更多信息.

Include tag

使用 include tag 很容易向 DSL 插入 一个 XML layout :
include<View>(R.layout.something) {
backgroundColor = Color.RED
}.lparams(width = matchParent) { margin = dip(12) }
通常可以使用 lparams , 如果类型不是 View,仍然可以用 {}:
include<TextView>(R.layout.textfield) {
text = "Hello, world!"
}
Styles

Anko 支持 styling: style 是一个简单的函数,接受一个View, 效果作用于这个 View , 并且当这个View 是一个ViewGroup 时,可以可以递归的作用与 这个View的 child View:
verticalLayout {
editText {
hint = "Name"
}
editText {
hint = "Password"
}
}.style {
view -> when(view) {
is EditText -> view.textSize = 20f
}
}

转自:http://www.jianshu.com/p/7cf5b42eb25









 

为什么我要改用Kotlin

kotlin文章长路漫漫 发表了文章 • 0 个评论 • 420 次浏览 • 2017-07-23 23:52 • 来自相关话题

 写在前面的话,作为一个不熬夜的人,一觉醒来发现Kotlin成为了Android的官方语言,可谓是大喜过望。为了趁热打铁,我决定提前三天放出原定本周日Release的文章。希望能及时让大家了解一下Kotlin。

相信很多开发人员,尤其是android开发者都会或多或少听说过Kotlin,当然如果没有听过或者不熟悉也没有关系。因为本篇文章以及博客后期的内容会涉及到很多关于Kotlin的知识分享。

在写这篇文章前的一个多月,Flipboard中国的Android项目确定了正式将Kotlin作为项目开发语言,这就意味着新增的代码文件将以Kotlin代码格式出现,而且同时旧的Java代码也将会陆陆续续翻译成Kotlin代码。在使用Kotlin的这段时间,被它的简洁,高效,快捷等等特点震撼,所以有必要写一篇文章来谈一谈Kotlin的特性,如若能取得推广Kotlin的效果则倍感欣慰。 


Kotlin的“简历”
来自于著名的IDE IntelliJ IDEA(Android Studio基于此开发) 软件开发公司 JetBrains(位于东欧捷克)起源来自JetBrains的圣彼得堡团队,名称取自圣彼得堡附近的一个小岛(Kotlin Island)一种基于JVM的静态类型编程语言

来自知名的工具开发商JetBrains,也就决定了Kotlin的基因中必然包含实用与高效等特征。那我们接下来看一看Kotlin的特点,当然这也是我改用Kotlin的重要原因。

语法简单,不啰嗦//variables and constants
var currentVersionCode = 1 //变量当前的版本号,类型Int可以根据值推断出来
var currentVersionName : String = "1.0" //显式标明类型
val APPNAME = "droidyue.com" //常量APPNAME 类型(String)可以根据值推断出来

//methods
fun main(args: Array<String>) {
println(args)
}

// class
class MainActivity : AppCompatActivity() {

}

// data class 自动生成getter,setting,hashcode和equals等方法
data class Book(var name: String, val price: Float, var author: String)

//支持默认参数值,减少方法重载
fun Context.showToast(message: String, duration:Int = Toast.LENGTH_LONG) {
Toast.makeText(this, message, duration).show()
}
Kotlin支持类型推断,没有Java那样的啰嗦。另外用var表示变量,val表示常量更加的简洁方法也很简单,连function都缩写成了fun,平添了几分双关之意。类的继承和实现很简单,使用:即可Kotlin每个句子都不需要加分号(;)

空指针安全

空指针(NullPointerException或NPE)是我们使用Java开发程序中最常见的崩溃了。因为在Java中我们不得不写很多防御性的代码,比如这样public void test(String string) {
if (string != null) {
char chars = string.toCharArray();
if (chars.length > 10) {
System.out.println(((Character)chars[10]).hashCode());
}
}
}在Kotlin中空指针异常得到了很好的解决。
在类型上的处理,即在类型后面加上,即表示这个变量或参数以及返回值可以为null,否则不允许为变量参数赋值为null或者返回null对于一个可能是null的变量或者参数,在调用对象方法或者属性之前,需要加上,否则编译无法通过。

如下面的代码就是Kotlin实现空指针安全的一个例子,而且相对Java实现而言,简直是一行代码搞定的。fun testNullSafeOperator(string: String?) {
System.out.println(string?.toCharArray()?.getOrNull(10)?.hashCode())
}

testNullSafeOperator(null)
testNullSafeOperator("12345678901")
testNullSafeOperator("123")

//result
null
49
null关于空指针安全的原理,可以参考这篇文章研究学习Kotlin的一些方法

支持方法扩展

很多时候,Framework提供给我们的API往往都时比较原子的,调用时需要我们进行组合处理,因为就会产生了一些Util类,一个简单的例子,我们想要更快捷的展示Toast信息,在Java中我们可以这样做。public static void longToast(Context context, String message) {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}但是Kotlin的实现却让人惊奇,我们只需要重写扩展方法就可以了,比如这个longToast方法扩展到所有的Context对象中,如果不去追根溯源,可能无法区分是Framework提供的还是自行扩展的。fun Context.longToast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
applicationContext.longToast("hello world")注意:Kotlin的方法扩展并不是真正修改了对应的类文件,而是在编译器和IDE方面做得处理。使我们看起来像是扩展了方法。

Lambda, 高阶函数,Streams API, 函数式编程支持

所谓的Lambda表达式是匿名函数,这使得我们的代码会更加的简单。比如下面的代码就是lambda的应用。findViewById(R.id.content).setOnClickListener {
Log.d("MainActivity", "$it was clicked")
}所谓的高阶函数就是
可以接受函数作为参数也可以返回函数作为结果

举一个接受函数作为参数的例子。在Android开发中,我们经常使用SharedPreference来存储数据,如果忘记调用apply或者commit则数据修改不能应用。利用Kotlin中的高阶函数的功能,我们能更好的解决这个问题fun SharedPreferences.editor(f: (SharedPreferences.Editor) -> Unit) {
val editor = edit()
f(editor)
editor.apply()
}

//实际调用
PreferenceManager.getDefaultSharedPreferences(this).editor {
it.putBoolean("installed", true)
}当然这上面的例子中我们也同时使用了方法扩展这个特性。

Kotlin支持了Streams API和方法引用,这样函数式编程更加方便。比如下面的代码就是我们结合Jsoup,来抓取某个proxy网站的数据,代码更加简单,实现起来也快速。fun parse(url: String): Unit {
Jsoup.parse(URL(url), PARSE_URL_TIMEOUT).getElementsByClass("table table-sm")
.first().children()
.filter { "tbody".equals(it.tagName().toLowerCase()) }
.flatMap(Element::children).forEach {
trElement ->
ProxyItem().apply {
trElement.children().forEachIndexed { index, element ->
when (index) {
0 -> {
host = element.text().split(":")[0]
port = element.text().split(":")[1].toInt()
}
1 -> protocol = element.text()
5 -> country = element.text()
}
}
}.let(::println)
}
}
 字符串模板

无论是Java还是Android开发,我们都会用到字符串拼接,比如进行日志输出等等。在Kotlin中,字符串模板是支持的,我们可以很轻松的完成一个字符串数组的组成val book = Book("Thinking In Java", 59.0f, "Unknown")
val extraValue = "extra"
Log.d("MainActivity", "book.name = ${book.name}; book.price=${book.price};extraValue=$extraValue")注意:关于字符串拼接可以参考这篇文章Java细节:字符串的拼接
 
与Java交互性好

Kotlin和Java都属于基于JVM的编程语言。Kotlin和Java的交互性很好,可以说是无缝连接。这表现在
Kotlin可以自由的引用Java的代码,反之亦然。Kotlin可以现有的全部的Java框架和库Java文件可以很轻松的借助IntelliJ的插件转成kotlin

Kotlin应用广泛

Kotlin对Android应用开发支持广泛,诸多工具,比如kotterknife(ButterKnife Kotlin版),RxKotlin,Anko等等,当然还有已经存在的很多Java的库都是可以使用的。

除此之外,Kotlin也可以编译成JavaScript。最近使用Kotlin写了一段抓取proxy的代码,实现起来非常快捷。甚至比纯javascript实现起来要快很多。fun handle(): Unit {
window.onload = {
document.getElementsByClassName("table table-sm").asList().first()
.children.asList().filter { "TBODY".equals(it.tagName.toUpperCase()) }
.flatMap { it.children.asList() }.forEach {
var proxyItem = ProxyItem()
it.children.asList().forEachIndexed { index, element ->
when (index) {
0 -> {
proxyItem.host = element.trimedTextContent()?.split(":")?.get(0) ?: ""
proxyItem.port = element.trimedTextContent()?.split(":")?.get(1)?.trim()?.toInt() ?: -1
}
1 -> proxyItem.protocol = element.trimedTextContent() ?: ""
5 -> proxyItem.country = element.trimedTextContent() ?: ""
}
}.run {
console.info("proxyItem $proxyItem")
}

}
}
}
 关于性能

Kotlin的执行效率和Java代码的执行效率理论上一致的。有时候Kotlin可能会显得高一些,比如Kotlin提供了方法的inline设置,可以设置某些高频方法进行inline操作,减少了运行时的进栈出栈和保存状态的开销。

读到这里,是不是想要尝试一下Kotlin呢,它简洁的语法,汇集诸多特性,高效率实现等等,已经在国外风生水起,国外的Pintereset, Square, Flipboard等公司已经开始应用到生产中。

关于转向Kotlin

其实,我在做决定之前(当时Kotlin还没有被钦定)也曾有过考虑,是不是选择了Kotlin就意味着放弃Java呢,冷静下来想一想,其实并不是那么回事,因为Kotlin与Java语法太相近,以及在Kotlin中无时无刻不在和Java相关的东西打交道,所以这点顾虑不是问题的。

对于个人的项目来转向Kotlin,通常不是很难的选择,毕竟Kotlin是那么优秀的语言,相信很多人还是愿意尝试并使用这个事半功倍的语言的。

而比较难抉择的情况是如果如何让团队转用Kotlin,个人认为团队难以转用的原因有很多,比如学习成本,历史包袱等等。但其实根本原因还是思维方式的问题,歪果仁喜欢用工具来提升开发效率,因为人力成本很高。而国内团队提高效率的办法通常是增加成员。好在Flipboard 美国团队自2015年(可能更早)就引入了Kotlin,因此中国团队这边选用Kotlin也更加顺水推舟。当然更主要的是目前团队规模不大,成员一致认可Kotlin的优点。

关于团队转用Kotlin的方法,一般比较行得通的办法是自上而下的推行。这就意味着要么直接的技术负责人比较开明要么就是需要有人来不断推介来影响团队。

做个比较现实的比拟,Java就像是一趟从我的家乡保定开往北京西的耗时将近2个小时甚至更长的普通列车,而Kotlin则是那趟仅需40分钟就能到达的高铁。通常的人都会选择高铁,因为它节省了时间和提高了体验。这个时间和体验对应编程中的,我想应该是高效率和高可读性,可维护性的代码。

现在好了,有了Google的支持,Kotlin转Android相信在不久的将来就会全面展开。篡改Python的一句名言“人生苦短,我用Kotlin”,这样一个高效实用的语言应该会被越来越多的团队所接受,并应用到开发生产中。当然也希望在国内环境下大放异彩。
 
 转自: 为什么我要改用Kotlin
 
在学习Kotlin中难免会遇到一些不懂的和一些坑,这时候就需要大家相互分享和提点,这里推荐一下Kotlin社区,欢迎大家来交流。 

下面附上qq群:302755325
  查看全部
1-TJXYjBragnuWjtbxtEHQxg.png


 写在前面的话,作为一个不熬夜的人,一觉醒来发现Kotlin成为了Android的官方语言,可谓是大喜过望。为了趁热打铁,我决定提前三天放出原定本周日Release的文章。希望能及时让大家了解一下Kotlin。

相信很多开发人员,尤其是android开发者都会或多或少听说过Kotlin,当然如果没有听过或者不熟悉也没有关系。因为本篇文章以及博客后期的内容会涉及到很多关于Kotlin的知识分享。

在写这篇文章前的一个多月,Flipboard中国的Android项目确定了正式将Kotlin作为项目开发语言,这就意味着新增的代码文件将以Kotlin代码格式出现,而且同时旧的Java代码也将会陆陆续续翻译成Kotlin代码。在使用Kotlin的这段时间,被它的简洁,高效,快捷等等特点震撼,所以有必要写一篇文章来谈一谈Kotlin的特性,如若能取得推广Kotlin的效果则倍感欣慰。 


Kotlin的“简历”
  • 来自于著名的IDE IntelliJ IDEA(Android Studio基于此开发) 软件开发公司 JetBrains(位于东欧捷克)
  • 起源来自JetBrains的圣彼得堡团队,名称取自圣彼得堡附近的一个小岛(Kotlin Island)
  • 一种基于JVM的静态类型编程语言


来自知名的工具开发商JetBrains,也就决定了Kotlin的基因中必然包含实用与高效等特征。那我们接下来看一看Kotlin的特点,当然这也是我改用Kotlin的重要原因。

语法简单,不啰嗦
//variables and constants
var currentVersionCode = 1 //变量当前的版本号,类型Int可以根据值推断出来
var currentVersionName : String = "1.0" //显式标明类型
val APPNAME = "droidyue.com" //常量APPNAME 类型(String)可以根据值推断出来

//methods
fun main(args: Array<String>) {
println(args)
}

// class
class MainActivity : AppCompatActivity() {

}

// data class 自动生成getter,setting,hashcode和equals等方法
data class Book(var name: String, val price: Float, var author: String)

//支持默认参数值,减少方法重载
fun Context.showToast(message: String, duration:Int = Toast.LENGTH_LONG) {
Toast.makeText(this, message, duration).show()
}

  • Kotlin支持类型推断,没有Java那样的啰嗦。
  • 另外用var表示变量,val表示常量更加的简洁
  • 方法也很简单,连function都缩写成了fun,平添了几分双关之意。
  • 类的继承和实现很简单,使用:即可
  • Kotlin每个句子都不需要加分号(;)


空指针安全

空指针(NullPointerException或NPE)是我们使用Java开发程序中最常见的崩溃了。因为在Java中我们不得不写很多防御性的代码,比如这样
public void test(String string) {
if (string != null) {
char chars = string.toCharArray();
if (chars.length > 10) {
System.out.println(((Character)chars[10]).hashCode());
}
}
}
在Kotlin中空指针异常得到了很好的解决。
  • 在类型上的处理,即在类型后面加上,即表示这个变量或参数以及返回值可以为null,否则不允许为变量参数赋值为null或者返回null
  • 对于一个可能是null的变量或者参数,在调用对象方法或者属性之前,需要加上,否则编译无法通过。


如下面的代码就是Kotlin实现空指针安全的一个例子,而且相对Java实现而言,简直是一行代码搞定的。
fun testNullSafeOperator(string: String?) {
System.out.println(string?.toCharArray()?.getOrNull(10)?.hashCode())
}

testNullSafeOperator(null)
testNullSafeOperator("12345678901")
testNullSafeOperator("123")

//result
null
49
null
关于空指针安全的原理,可以参考这篇文章研究学习Kotlin的一些方法

支持方法扩展

很多时候,Framework提供给我们的API往往都时比较原子的,调用时需要我们进行组合处理,因为就会产生了一些Util类,一个简单的例子,我们想要更快捷的展示Toast信息,在Java中我们可以这样做。
public static void longToast(Context context, String message) {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
但是Kotlin的实现却让人惊奇,我们只需要重写扩展方法就可以了,比如这个longToast方法扩展到所有的Context对象中,如果不去追根溯源,可能无法区分是Framework提供的还是自行扩展的。
fun Context.longToast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
applicationContext.longToast("hello world")
注意:Kotlin的方法扩展并不是真正修改了对应的类文件,而是在编译器和IDE方面做得处理。使我们看起来像是扩展了方法。

Lambda, 高阶函数,Streams API, 函数式编程支持

所谓的Lambda表达式是匿名函数,这使得我们的代码会更加的简单。比如下面的代码就是lambda的应用。
findViewById(R.id.content).setOnClickListener {
Log.d("MainActivity", "$it was clicked")
}
所谓的高阶函数就是
  • 可以接受函数作为参数
  • 也可以返回函数作为结果


举一个接受函数作为参数的例子。在Android开发中,我们经常使用SharedPreference来存储数据,如果忘记调用apply或者commit则数据修改不能应用。利用Kotlin中的高阶函数的功能,我们能更好的解决这个问题
fun SharedPreferences.editor(f: (SharedPreferences.Editor) -> Unit) {
val editor = edit()
f(editor)
editor.apply()
}

//实际调用
PreferenceManager.getDefaultSharedPreferences(this).editor {
it.putBoolean("installed", true)
}
当然这上面的例子中我们也同时使用了方法扩展这个特性。

Kotlin支持了Streams API和方法引用,这样函数式编程更加方便。比如下面的代码就是我们结合Jsoup,来抓取某个proxy网站的数据,代码更加简单,实现起来也快速。
fun parse(url: String): Unit {
Jsoup.parse(URL(url), PARSE_URL_TIMEOUT).getElementsByClass("table table-sm")
.first().children()
.filter { "tbody".equals(it.tagName().toLowerCase()) }
.flatMap(Element::children).forEach {
trElement ->
ProxyItem().apply {
trElement.children().forEachIndexed { index, element ->
when (index) {
0 -> {
host = element.text().split(":")[0]
port = element.text().split(":")[1].toInt()
}
1 -> protocol = element.text()
5 -> country = element.text()
}
}
}.let(::println)
}
}

 字符串模板

无论是Java还是Android开发,我们都会用到字符串拼接,比如进行日志输出等等。在Kotlin中,字符串模板是支持的,我们可以很轻松的完成一个字符串数组的组成
val book = Book("Thinking In Java", 59.0f, "Unknown")
val extraValue = "extra"
Log.d("MainActivity", "book.name = ${book.name}; book.price=${book.price};extraValue=$extraValue")
注意:关于字符串拼接可以参考这篇文章Java细节:字符串的拼接
 
与Java交互性好

Kotlin和Java都属于基于JVM的编程语言。Kotlin和Java的交互性很好,可以说是无缝连接。这表现在
  • Kotlin可以自由的引用Java的代码,反之亦然。
  • Kotlin可以现有的全部的Java框架和库
  • Java文件可以很轻松的借助IntelliJ的插件转成kotlin


Kotlin应用广泛

Kotlin对Android应用开发支持广泛,诸多工具,比如kotterknife(ButterKnife Kotlin版),RxKotlin,Anko等等,当然还有已经存在的很多Java的库都是可以使用的。

除此之外,Kotlin也可以编译成JavaScript。最近使用Kotlin写了一段抓取proxy的代码,实现起来非常快捷。甚至比纯javascript实现起来要快很多。
fun handle(): Unit {
window.onload = {
document.getElementsByClassName("table table-sm").asList().first()
.children.asList().filter { "TBODY".equals(it.tagName.toUpperCase()) }
.flatMap { it.children.asList() }.forEach {
var proxyItem = ProxyItem()
it.children.asList().forEachIndexed { index, element ->
when (index) {
0 -> {
proxyItem.host = element.trimedTextContent()?.split(":")?.get(0) ?: ""
proxyItem.port = element.trimedTextContent()?.split(":")?.get(1)?.trim()?.toInt() ?: -1
}
1 -> proxyItem.protocol = element.trimedTextContent() ?: ""
5 -> proxyItem.country = element.trimedTextContent() ?: ""
}
}.run {
console.info("proxyItem $proxyItem")
}

}
}
}

 关于性能

Kotlin的执行效率和Java代码的执行效率理论上一致的。有时候Kotlin可能会显得高一些,比如Kotlin提供了方法的inline设置,可以设置某些高频方法进行inline操作,减少了运行时的进栈出栈和保存状态的开销。

读到这里,是不是想要尝试一下Kotlin呢,它简洁的语法,汇集诸多特性,高效率实现等等,已经在国外风生水起,国外的Pintereset, Square, Flipboard等公司已经开始应用到生产中。

关于转向Kotlin

其实,我在做决定之前(当时Kotlin还没有被钦定)也曾有过考虑,是不是选择了Kotlin就意味着放弃Java呢,冷静下来想一想,其实并不是那么回事,因为Kotlin与Java语法太相近,以及在Kotlin中无时无刻不在和Java相关的东西打交道,所以这点顾虑不是问题的。

对于个人的项目来转向Kotlin,通常不是很难的选择,毕竟Kotlin是那么优秀的语言,相信很多人还是愿意尝试并使用这个事半功倍的语言的。

而比较难抉择的情况是如果如何让团队转用Kotlin,个人认为团队难以转用的原因有很多,比如学习成本,历史包袱等等。但其实根本原因还是思维方式的问题,歪果仁喜欢用工具来提升开发效率,因为人力成本很高。而国内团队提高效率的办法通常是增加成员。好在Flipboard 美国团队自2015年(可能更早)就引入了Kotlin,因此中国团队这边选用Kotlin也更加顺水推舟。当然更主要的是目前团队规模不大,成员一致认可Kotlin的优点。

关于团队转用Kotlin的方法,一般比较行得通的办法是自上而下的推行。这就意味着要么直接的技术负责人比较开明要么就是需要有人来不断推介来影响团队。

做个比较现实的比拟,Java就像是一趟从我的家乡保定开往北京西的耗时将近2个小时甚至更长的普通列车,而Kotlin则是那趟仅需40分钟就能到达的高铁。通常的人都会选择高铁,因为它节省了时间和提高了体验。这个时间和体验对应编程中的,我想应该是高效率和高可读性,可维护性的代码。

现在好了,有了Google的支持,Kotlin转Android相信在不久的将来就会全面展开。篡改Python的一句名言“人生苦短,我用Kotlin”,这样一个高效实用的语言应该会被越来越多的团队所接受,并应用到开发生产中。当然也希望在国内环境下大放异彩。
 
 转自: 为什么我要改用Kotlin
 
在学习Kotlin中难免会遇到一些不懂的和一些坑,这时候就需要大家相互分享和提点,这里推荐一下Kotlin社区,欢迎大家来交流。 

下面附上qq群:302755325
 

kotlin 的干货搜集 ,不能错过

kotlin教程长路漫漫 发表了文章 • 0 个评论 • 301 次浏览 • 2017-05-19 16:55 • 来自相关话题

1.官方资料
首发的肯定是kotlin的官方github地址了:https://github.com/JetBrains/kotlin

首发的肯定是kotlin的官方github地址了:

https://github.com/JetBrains/kotlin

晚上看了下trending,稳稳的站在第一。

平时大家没事,可以看看github trending,会有很多的新新优质资源。https://github.com/trending/java

Readme中包含官方的tutorials、推荐的图书《Kotlin in Action》、《Kotlin for Android Developers》以及其他资源。

英文不太好的不要担心,有官方中文翻译站点:

https://www.kotlincn.net/docs/reference/
https://www.gitbook.com/book/h ... tails

(2)《Kotlin for android developers》中文版翻译

https://github.com/wangjiegulu ... ME.md

支持在线阅读和下载pdf~

(3)张涛的开源实验室

之前在推送中推荐过张涛的博客,博客质量都很高,在很早的时候就开始编写Kotlin相关博客,此外还有很多比较新的知识~

https://kymjs.com/column/kotlin.html

(4)大精-wing的地方酒馆

让你的代码量减少3倍!使用kotlin开发Android系列~
http://androidwing.net/index.php/89

还有个Kotlin项目:
https://github.com/githubwing/GankClient-Kotlin

(5)Kotlin 视频教程
竟然还有视频教程~~

Kotlin从入门到『放弃』系列 视频教程
随着Kotlin越来越成熟稳定,我已经开始在生产环境中使用它。考虑到目前国内资料较少,我录制了一套视频教程,希望以此抛砖引玉,让 Kotlin 在国内火起来。
https://github.com/enbandari/Kotlin-Tutorials

可以百度云下载或者腾讯视频在线观看。

腾讯视频:http://v.qq.com/boke/gplay/903 ... .html
百度云:
http://pan.baidu.com/s/1nvGYAfB

(6)开源项目
一个用Kotlin写的简单漫画APP
https://github.com/wuapnjie/PoiShuhui-Kotlin

这个是我从俊林的文章中偷来的,如果有推荐可以留言~

(7)其他文章

为什么我要改用Kotlin
http://droidyue.com/blog/2017/ ... tlin/
by:技术小黑屋

Android开发必备知识:为什么说Kotlin值得一试
https://mp.weixin.qq.com/s%3F_ ... 151b6
by:腾讯Bugly公众号

使用Kotlin进行Android开发
http://ragnraok.github.io/usin ... .html
by:Ragnarok Zhou

最后要非常感谢,今天给我投稿的朋友(汇总资料,就直接放出了链接啦)~

使用Kotlin在Android Studio上开发App
http://blog.csdn.net/qq_258671 ... 75330
by:Blincheng

好文有很多,感谢所有人的分享~





  查看全部
1.官方资料
首发的肯定是kotlin的官方github地址了:https://github.com/JetBrains/kotlin

首发的肯定是kotlin的官方github地址了:

https://github.com/JetBrains/kotlin

晚上看了下trending,稳稳的站在第一。

平时大家没事,可以看看github trending,会有很多的新新优质资源。https://github.com/trending/java

Readme中包含官方的tutorials、推荐的图书《Kotlin in Action》、《Kotlin for Android Developers》以及其他资源。

英文不太好的不要担心,有官方中文翻译站点:

https://www.kotlincn.net/docs/reference/
https://www.gitbook.com/book/h ... tails

(2)《Kotlin for android developers》中文版翻译

https://github.com/wangjiegulu ... ME.md

支持在线阅读和下载pdf~

(3)张涛的开源实验室

之前在推送中推荐过张涛的博客,博客质量都很高,在很早的时候就开始编写Kotlin相关博客,此外还有很多比较新的知识~

https://kymjs.com/column/kotlin.html

(4)大精-wing的地方酒馆

让你的代码量减少3倍!使用kotlin开发Android系列~
http://androidwing.net/index.php/89

还有个Kotlin项目:
https://github.com/githubwing/GankClient-Kotlin

(5)Kotlin 视频教程
竟然还有视频教程~~

Kotlin从入门到『放弃』系列 视频教程
随着Kotlin越来越成熟稳定,我已经开始在生产环境中使用它。考虑到目前国内资料较少,我录制了一套视频教程,希望以此抛砖引玉,让 Kotlin 在国内火起来。
https://github.com/enbandari/Kotlin-Tutorials

可以百度云下载或者腾讯视频在线观看。

腾讯视频:http://v.qq.com/boke/gplay/903 ... .html
百度云:
http://pan.baidu.com/s/1nvGYAfB

(6)开源项目
一个用Kotlin写的简单漫画APP
https://github.com/wuapnjie/PoiShuhui-Kotlin

这个是我从俊林的文章中偷来的,如果有推荐可以留言~

(7)其他文章

为什么我要改用Kotlin
http://droidyue.com/blog/2017/ ... tlin/
by:技术小黑屋

Android开发必备知识:为什么说Kotlin值得一试
https://mp.weixin.qq.com/s%3F_ ... 151b6
by:腾讯Bugly公众号

使用Kotlin进行Android开发
http://ragnraok.github.io/usin ... .html
by:Ragnarok Zhou

最后要非常感谢,今天给我投稿的朋友(汇总资料,就直接放出了链接啦)~

使用Kotlin在Android Studio上开发App
http://blog.csdn.net/qq_258671 ... 75330
by:Blincheng

好文有很多,感谢所有人的分享~

Kotlin社区群二维码.png

 

Kotlin 在android studio下的初次使用

kotlin文章长路漫漫 发表了文章 • 0 个评论 • 294 次浏览 • 2017-05-19 15:59 • 来自相关话题

一觉醒来,发现微信群和qq群里不再是各种斗图了,而是谷歌在今日举行的I/O开发者大会上宣布,将Kotlin语言作为安卓开发的一级编程语言。Kotlin由JetBrains公司开发,与Java 100%互通,并具备诸多Java尚不支持的新特性。。那么你知道Kotlin是什么吗?如果还不知道那就赶紧自行百度一下。 
好了咱们言归正传,首先看下Kotlin的基本语法片段:
fun main(args: Array<String>) {
var x = 5 // 变量推导出Int类型
val a: Int = 1 // 常量立即初始化
val b = 2 // 推导出Int型
val c: Int // 当没有初始化值时必须声明类型
c = 3 // 赋值
println("a = $a, b = $b, c = $c")
}

class MyView : View { //继承关系
constructor(ctx: Context) : super(ctx) {
}
constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) {
}
}这只是代码中的一小部分摘出来的,想要了解更多,请大家去移步官方给出的基本语法中文版Kotlin的基本语法

Kotlin作为Android社区当前比较热的讨论内容, 已经发布了1.1.1版本, 并且得到了一些Google开发者的关注, 毕竟android Studio是基于JetBrains的框架. Java文件可以直接转换为Kotlin文件, 两者具有非常强的互操作性. 
现在咱们的目的是用Kotlin写出 Hello Kotlin!那么现在咱们的问题是如何集成Kotlin在android studio中,大家都知道android studio 3.0默认支持Kotlin ,可是现在同学们使用的大部分是2.2~2.3,所以需要集成插件。怎么配置呢?别着急,Follow me 

1.配置项目 

新建一个空的Android项目. 
项目gradle: 
添加Kotlin的版本号, 使用目前最新的1.1.1, 保持版本一致.大家可以自行去看下最新版本。
buildscript {
ext.kotlin_version = "1.1.1"
}模块gradle: 
添加类的路径, 必须在模块中添加, 因为kotlin-android-extensions插件会使用依赖.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
}
}添加Kotlin支持Android的插件
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'kotlin-android用于编译Android代码, kotlin-android-extensions用于扩展绑定关系.
 
添加Java的编译路径, 在main中创建kotlin文件夹, 用于存放kotlin代码(建议).
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}添加maven的依赖.
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}完整的支持Kotlin的模块build.gradle.
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.example.jmf.kotlin"
minSdkVersion 15
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'
}
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
}

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"
}
 2. 安装插件 

Android Studio的Kotlin插件, 用于支持Kotlin的语言特性. 
选择: Preferences -> Plugins -> Install JetBrains plugin -> kotlin

 
只需要安装Kotlin即可, 因为Kotlin Extensions已经包含在Kotlin中了
 
3. 转换代码 

选中需要转换的Java文件, 如MainActivity.java, 
使用Ctrl+Shift+A, 启动Action, 输入Convert, 找到命令, 即可转换, 如

或 
选择Code -> Convert java File to Kotlin File, 也可以使用快捷键.

把.kt的文件剪切到kotlin文件夹下, 即可使用.
 
推荐Kotlin文件和Java文件分开存放, 不过放在一起也可以使用.
 
4. 添加资源 

Kotlin的代码非常简洁, 设置属性也比较方便.
 
import android.os.Bundle
import android.support.v7.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
main_tv_message.text = "Hello Kotlin!"
main_tv_message.textSize = 20.0f
}
}id是main_tv_message的TextView, 设置text为”Hello Kotlin”. 
代码风格与Python等脚本语言非常类似, 容易编写.
 

 
到这里,你已经不知不觉的写出了Hello Kotlin。庆祝一下吧
 
在学习Kotlin中难免会遇到一些不懂的和一些坑,这时候就需要大家相互分享和提点,这里推荐一下Kotlin社区,欢迎大家来交流。 

下面附上qq群:302755325 查看全部
一觉醒来,发现微信群和qq群里不再是各种斗图了,而是谷歌在今日举行的I/O开发者大会上宣布,将Kotlin语言作为安卓开发的一级编程语言。Kotlin由JetBrains公司开发,与Java 100%互通,并具备诸多Java尚不支持的新特性。。那么你知道Kotlin是什么吗?如果还不知道那就赶紧自行百度一下。 
好了咱们言归正传,首先看下Kotlin的基本语法片段:
fun main(args: Array<String>) {
var x = 5 // 变量推导出Int类型
val a: Int = 1 // 常量立即初始化
val b = 2 // 推导出Int型
val c: Int // 当没有初始化值时必须声明类型
c = 3 // 赋值
println("a = $a, b = $b, c = $c")
}

class MyView : View { //继承关系
constructor(ctx: Context) : super(ctx) {
}
constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) {
}
}
这只是代码中的一小部分摘出来的,想要了解更多,请大家去移步官方给出的基本语法中文版Kotlin的基本语法

Kotlin作为Android社区当前比较热的讨论内容, 已经发布了1.1.1版本, 并且得到了一些Google开发者的关注, 毕竟android Studio是基于JetBrains的框架. Java文件可以直接转换为Kotlin文件, 两者具有非常强的互操作性. 
现在咱们的目的是用Kotlin写出 Hello Kotlin!那么现在咱们的问题是如何集成Kotlin在android studio中,大家都知道android studio 3.0默认支持Kotlin ,可是现在同学们使用的大部分是2.2~2.3,所以需要集成插件。怎么配置呢?别着急,Follow me 

1.配置项目 

新建一个空的Android项目. 
项目gradle: 
添加Kotlin的版本号, 使用目前最新的1.1.1, 保持版本一致.大家可以自行去看下最新版本。
buildscript {
ext.kotlin_version = "1.1.1"
}
模块gradle: 
添加类的路径, 必须在模块中添加, 因为kotlin-android-extensions插件会使用依赖.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
}
}
添加Kotlin支持Android的插件
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
kotlin-android用于编译Android代码, kotlin-android-extensions用于扩展绑定关系.
 
添加Java的编译路径, 在main中创建kotlin文件夹, 用于存放kotlin代码(建议).
 sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
添加maven的依赖.
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
完整的支持Kotlin的模块build.gradle.
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.example.jmf.kotlin"
minSdkVersion 15
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'
}
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
}

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"
}

 2. 安装插件 

Android Studio的Kotlin插件, 用于支持Kotlin的语言特性. 
选择: Preferences -> Plugins -> Install JetBrains plugin -> kotlin

 
只需要安装Kotlin即可, 因为Kotlin Extensions已经包含在Kotlin中了
 
3. 转换代码 

选中需要转换的Java文件, 如MainActivity.java, 
使用Ctrl+Shift+A, 启动Action, 输入Convert, 找到命令, 即可转换, 如

或 
选择Code -> Convert java File to Kotlin File, 也可以使用快捷键.

把.kt的文件剪切到kotlin文件夹下, 即可使用.
 
推荐Kotlin文件和Java文件分开存放, 不过放在一起也可以使用.
 
4. 添加资源 

Kotlin的代码非常简洁, 设置属性也比较方便.
 
import android.os.Bundle
import android.support.v7.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
main_tv_message.text = "Hello Kotlin!"
main_tv_message.textSize = 20.0f
}
}
id是main_tv_message的TextView, 设置text为”Hello Kotlin”. 
代码风格与Python等脚本语言非常类似, 容易编写.
 

 
到这里,你已经不知不觉的写出了Hello Kotlin。庆祝一下吧
 
在学习Kotlin中难免会遇到一些不懂的和一些坑,这时候就需要大家相互分享和提点,这里推荐一下Kotlin社区,欢迎大家来交流。 

下面附上qq群:302755325

如何在Kotlin中声明二次构造函数?

回复

kotlin问答长路漫漫 发起了问题 • 1 人关注 • 0 个回复 • 347 次浏览 • 2017-05-18 12:56 • 来自相关话题

在Kotlin中这个表达式的等价物是什么?

回复

kotlin问答长路漫漫 发起了问题 • 1 人关注 • 0 个回复 • 273 次浏览 • 2017-05-18 12:49 • 来自相关话题

如何评价 Kotlin 语言?

kotlin问答长路漫漫 回复了问题 • 2 人关注 • 1 个回复 • 353 次浏览 • 2017-05-18 12:07 • 来自相关话题

Kotlin中文文档

kotlin问答kotlin 发表了文章 • 0 个评论 • 526 次浏览 • 2017-05-18 11:47 • 来自相关话题

kotlin的无敌开发文档,有了它,妈妈再也不用担心我的工作了,哪里不会看哪里,适合刚接触Kotlin。
kotlin的无敌开发文档,有了它,妈妈再也不用担心我的工作了,哪里不会看哪里,适合刚接触Kotlin。