kotlin和android_android. kotlin. kotlin-stdlib - CSDN
  • 答:本文主要通过本人如何从java转战到kotlin并应用在实际项目中的个人经历,给大家提供一些学习思路、学习方法以及一些学习资料个人总结。 前提:你的项目(包含个人项目)即将开始用到kotlin(没有项目作为...

    前言

    kotlin是啥?这里就不用多说了,想必看这篇文章的童鞋肯定是有所了解的。

    那么这篇文章你可以收获什么?

    答:本文主要通过本人如何从java转战到kotlin并应用在实际项目中的个人经历,给大家提供一些学习思路、学习方法以及一些学习资料和个人总结。

    前提:你的项目(包含个人项目)即将开始用到kotlin(没有项目作为依托你会缺少十足的动力,而且缺少应用场景乘热打铁那也是白学)
    建议:建议没有切换kotlin的小伙伴快来转战kotlin吧!最近一段时间搞了kotlin之后发现写起来确实比java爽多了,语法非常精简,而且据统计现已有30%安卓项目使用了kotlin,所以小伙伴们行动起来吧,这必定是大势所趋,可千万别被淘汰了啊

    入门

    俗话说万事开头难,不过我们先把Kotlin语法学习一遍,你就会发现so easy,而且语言思想都是相通的

    第一步:学习语法

    当然是去官网学习喽:http://kotlinlang.org/docs/reference/

    如下图:

    不过英文吃力的小伙伴可以去菜鸟教程网站学习

    地址:http://www.runoob.com/kotlin/kotlin-tutorial.html

    如下图:

    内容与官网一致。

    不过不能光看,一定要写,就算照着抄也要多写,尽量在学习时候多和java语法做对比,会印象深刻。
    如下图,本人的练习代码:

    第二步:对比学习

    大家可以参考下面的链接进行学习:

    from-java-to-kotlin : https://github.com/MindorksOpenSource/from-java-to-kotlin

    from-java-to-kotlin中给出了我们常用的语法对比

    如图:

    第三步:Demo练习

    通过上面的学习我们此刻已经熟悉了kotlin的基本语法,可以来尝试写一个万年历的Demo。

    1、新建工程

    我们新建一个工程,点击Include kotlin support
    如图:

    我们看一下Include kotlin support都帮我们做了什么事情

    首先module中gradle文件

    如图:

    比我们之前的工程多了下面两个引用和一个依赖:

    // 使用Kotlin插件
    apply plugin: 'kotlin-android'
    // 使用Kotlin Android扩展插件
    apply plugin: 'kotlin-android-extensions'
    
    dependencies {
        //...
        //添加Kotlin 标准库
        compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
        //...
    }
    

    知识点: kotlin-android-extensions相当于DataBinding,同样的目的为了偷懒不用写findViewByIdAndroid 开发必备。

    我们再看一下project中的gradle文件
    如图:

    比我们之前的工程多了Kotlin编译插件:

    // 添加了Kotlin编译插件
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    

    2、Demo说明

    该项目使用MVP模式,里面用到了Retrofit2+RxJava2,然后使用了聚合的万年历接口,Demo非常简单便于初学者快速掌握。

    Demo使用展示:

    工程目录结构如图:

    3、Activity

    看下布局文件非常简单,我们可以在activity里面直接将控件的id当成变量来使用

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        ....">
    
        <DatePicker
            android:id="@+id/dataPicker"
            .... />
    
        <Button
            android:id="@+id/selectButton"
            .... />
    
        <TextView
            android:id="@+id/titleTextView"
            .... />
    
        <TextView
            android:id="@+id/contentTextView"
           ....
           />
    
    </android.support.constraint.ConstraintLayout>
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    
        selectButton.setOnClickListener {
            titleTextView.visibility = View.GONE
            selectButton.visibility = View.GONE
            contentTextView.visibility = View.GONE
            dataPicker.visibility = View.VISIBLE
        }
        ....
        ....
    }
    

    注意:直接使用id作为变量的时候,要在Module的gradle里面加入扩展,才能使用,不然会报错

    apply plugin: 'kotlin-android-extensions'
    

    这个上面已经说过,我们创建工程的时候如果选中Include kotlin support怎会自动在gradle中生成。

    4、Retrofit+RxJava

    Retrofit结合RxJava能快捷的使用网络请求。

    创建Service接口,Kotlin的类型是写在后面

    interface RetrofitService {
    
        /**
         *  获取当天详细信息
         *  @param date 日期
         */
        @GET("calendar/day")
        fun calenderDay(
                @Query("date") date: String,
                @Query("key") key: String
        ): Observable<CalentarDayBean>
    
        /**
         *  获取近期假期
         *  @param date 日期
         */
        @GET("calendar/month")
        fun calenderMonth(
                @Query("date") date: String
        ): Observable<CalentarMonthBean>
    
        /**
         *  获取当年假期列表
         *  @param date 日期
         */
        @GET("calendar/year")
        fun calenderYear(
                @Query("date") date: String
        ): Observable<CalentarYearBean>
    }
    
    

    创建Retrofit,Kotlin的class并不支持static变量,所以需要使用companion object来声明static变量,其实这个变量也不是真正的static变量,而是一个伴生对象

    伴生对象可以实现静态调用,通过类名.属性名或者类名.方法名进行调用

    class RetrofitUtil {
        companion object {
            /**
             * 创建Retrofit
             */
            fun create(url: String): Retrofit {
                //日志显示级别
                val level: HttpLoggingInterceptor.Level = HttpLoggingInterceptor.Level.BODY
                //新建log拦截器
                val loggingInterceptor: HttpLoggingInterceptor = HttpLoggingInterceptor(HttpLoggingInterceptor.Logger {
                    message -> Logger.e("OkHttp: " + message)
                })
                loggingInterceptor.level = level
                // okHttpClientBuilder
                val okHttpClientBuilder = OkHttpClient().newBuilder()
    
                okHttpClientBuilder.connectTimeout(60, TimeUnit.SECONDS)
                okHttpClientBuilder.readTimeout(10, TimeUnit.SECONDS)
                //OkHttp进行添加拦截器loggingInterceptor
                //okHttpClientBuilder.addInterceptor(loggingInterceptor)
    
                return Retrofit.Builder()
                        .baseUrl(url)
                        .client(okHttpClientBuilder.build())
                        .addConverterFactory(GsonConverterFactory.create())
                        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                        .build()
            }
    
            val retrofitService: RetrofitService = RetrofitUtil.getService(Constants.REQUEST_BASE_URL, RetrofitService::class.java)
    
            /**
             * 获取ServiceApi
             */
            fun <T> getService(url: String, service: Class<T>): T {
                return create(url).create(service)
            }
        }
    }
    

    通过伴生对象,结合Retrofit结合RxJava 我们直接就可以调用接口了

    RetrofitUtil
        .retrofitService
        .calenderDay(date,"933dc930886c8c0717607f9f8bae0b48")
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ result ->
            view?.showDayCalentarData(result)
            Logger.e(result.toString())
        }, { error ->
            view?.showError(error.message.toString())
            Logger.e(error.message.toString())
        })
    

    5、使用对象声明

    在写项目的时候,一般会将常量统一写到一个类里面,然后设置静态变量,由于在Kotlin中不存在静态变量,所有就有对象声明的存在,对象声明比较常用的地方就是在这里,对象声明用Objcet关键字表示。

    object Constants {
    
        val REQUEST_BASE_URL = "http://v.juhe.cn/"
    
        val KEY = "1be865c0e67e3"
    }
    

    使用的时候直接类名加.加变量名,如Constants.REQUEST_BASE_URL

    6、使用数据类

    Kotlin有专门的数据类,就是用data修饰的类
    首先我们先看一下json数据:

    {
    	"reason":"Success",
    	"result":{
    		"data":{
    			"date":"2018-4-4",
    			"weekday":"星期三",
    			"animalsYear":"狗",
    			"suit":"订盟.纳采.冠笄.拆卸.修造.动土.安床.入殓.除服.成服.移柩.安葬.破土.启攒.造仓.",
    			"avoid":"作灶.开光.嫁娶.开市.入宅.",
    			"year-month":"2018-4",
    			"lunar":"二月十九",
    			"lunarYear":"戊戌年"
    		}
    	},
    	"error_code":0
    }
    

    再来看一下我的数据类:

    data class CalentarDayBean(
        val reason: String,
        val result: CalentarDayResult,
        val error_code: Int
    )
    
    data class CalentarDayResult(
            val data: CalentarDayData
    )
    
    data class CalentarDayData(
            val date: String,
            val weekday: String,
            val animalsYear: String,
            val suit: String,
            val avoid: String,
            val yearMonth: String,
            val holiday: String,
            val lunar: String,
            val lunarYear: String,
            val desc: String
    )
    

    就是如此方便

    7、MVP

    kotlin的MVP和java原理一模一样我先定义了IBaseModelIBaseView

    IBaseModel

    interface IBaseModel<T> {
    
        fun onDestroy()
    
        fun attachView(view: T)
    }
    

    IBaseView

    interface IBaseView {
    
        fun showLoading()
    
    
        fun hideLoading()
    
        fun showMessage(message: String)
    
        fun killMyself()
    }
    

    然后完成ICalentarContract,这个类似合同类的接口把P和V的所有方法全部写在一起,看起来代码格外清楚

    interface ICalentarContract {
        /**
         * 对于经常使用的关于UI的方法可以定义到IBaseView中,如显示隐藏进度条,和显示文字消息
         */
        interface View : IBaseView {
            fun showDayCalentarData(calentarDayBean: CalentarDayBean)
            fun showError(errorMsg: String)
        }
    
        /**
         * Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,如是否使用缓存
         */
        interface Model : IBaseModel<ICalentarContract.View> {
            fun getDayCalentarData(date: String)
        }
    }
    

    然后activity去实现ICalentarContract.View,presenter去实现ICalentarContract.Model

    class CalentarDatePresenter : ICalentarContract.Model {
    ....
    }
    
    class MainActivity : AppCompatActivity(), ICalentarContract.View {
    ...
    }
    

    so easy~~~ 到这里我们的Demo就完成了,可以尽情玩乐。

    项目地址:待上传。。。。。。。。。。。。。

    好了,到这里我们基本掌握了Kotlin在安卓中的应用,那么接下来就需要去学习一下kotlin设计模式以及一些进阶知识~

    进阶

    一、Kotlin设计模式

    本文只列出几个常用的设计模式

    1、观察者模式( observer pattern )

    Example

    interface TextChangedListener {
        fun onTextChanged(newText: String)
    }
    
    class PrintingTextChangedListener : TextChangedListener {
        override fun onTextChanged(newText: String) = println("Text is changed to: $newText")
    }
    
    class TextView {
    
        var listener: TextChangedListener? = null
    
        var text: String by Delegates.observable("") { prop, old, new ->
            listener?.onTextChanged(new)
        }
    }
    

    Usage

    val textView = TextView()
    textView.listener = PrintingTextChangedListener()
    textView.text = "Lorem ipsum"
    textView.text = "dolor sit amet"
    

    Output

    Text is changed to: Lorem ipsum
    Text is changed to: dolor sit amet
    

    2、策略模式( strategy pattern )

    Example

    class Printer(val stringFormatterStrategy: (String) -> String) {
        fun printString(string: String) = println(stringFormatterStrategy.invoke(string))
    }
    
    val lowerCaseFormatter: (String) -> String = { it.toLowerCase() }
    
    val upperCaseFormatter = { it: String -> it.toUpperCase() }
    

    Usage

    val lowerCasePrinter = Printer(lowerCaseFormatter)
    lowerCasePrinter.printString("LOREM ipsum DOLOR sit amet")
    
    val upperCasePrinter = Printer(upperCaseFormatter)
    upperCasePrinter.printString("LOREM ipsum DOLOR sit amet")
    
    val prefixPrinter = Printer({ "Prefix: " + it })
    prefixPrinter.printString("LOREM ipsum DOLOR sit amet")
    

    Output

    lorem ipsum dolor sit amet
    LOREM IPSUM DOLOR SIT AMET
    Prefix: LOREM ipsum DOLOR sit amet
    

    3、单例模式(singleton pattern)

    Example

    class Singletone private constructor() {
        init {
            println("Initializing with object: $this")
        }
    
        companion object {
            val getInstance =SingletonHolder.holder
        }
    
        private object SingletonHolder {
            val holder = Singletone()
        }
    
        fun print() = println("Printing with object: $this")
    }
    
    

    Usage

    Singletone.getInstance.print()
    Singletone.getInstance.print()
    

    Output

    Initializing with object: advance.Singletone@266474c2
    Printing with object: advance.Singletone@266474c2
    Printing with object: advance.Singletone@266474c2
    

    4、工厂模式(Factory Method)

    Example

    interface Currency {
        val code: String
    }
    
    class Euro(override val code: String = "EUR") : Currency
    class UnitedStatesDollar(override val code: String = "USD") : Currency
    
    enum class Country {
        UnitedStates, Spain, UK, Greece
    }
    
    class CurrencyFactory {
        fun currencyForCountry(country: Country): Currency? {
            when (country) {
                Country.Spain, Country.Greece -> return Euro()
                Country.UnitedStates          -> return UnitedStatesDollar()
                else                          -> return null
            }
        }
    }
    

    Usage

    val noCurrencyCode = "No Currency Code Available"
    
    val greeceCode = CurrencyFactory().currencyForCountry(Country.Greece)?.code() ?: noCurrencyCode
    println("Greece currency: $greeceCode")
    
    val usCode = CurrencyFactory().currencyForCountry(Country.UnitedStates)?.code() ?: noCurrencyCode
    println("US currency: $usCode")
    
    val ukCode = CurrencyFactory().currencyForCountry(Country.UK)?.code() ?: noCurrencyCode
    println("UK currency: $ukCode")
    

    Output

    Greece currency: EUR
    US currency: USD
    UK currency: No Currency Code Available
    

    5、代理模式(Protection Proxy)

    Example

    interface File {
        fun read(name: String)
    }
    
    class NormalFile : File {
        override fun read(name: String) = println("Reading file: $name")
    }
    
    //Proxy:
    class SecuredFile : File {
        val normalFile = NormalFile()
        var password: String = ""
    
        override fun read(name: String) {
            if (password == "secret") {
                println("Password is correct: $password")
                normalFile.read(name)
            } else {
                println("Incorrect password. Access denied!")
            }
        }
    }
    

    Usage

    val securedFile = SecuredFile()
    securedFile.read("readme.md")
    
    securedFile.password = "secret"
    securedFile.read("readme.md")
    

    Output

    Incorrect password. Access denied!
    Password is correct: secret
    Reading file: readme.md
    

    6、建造者模式(builder pattern)

    Example

    // Let's assume that Dialog class is provided by external library.
    // We have only access to Dialog public interface which cannot be changed.
    
    class Dialog() {
    
        fun showTitle() = println("showing title")
    
        fun setTitle(text: String) = println("setting title text $text")
    
        fun setTitleColor(color: String) = println("setting title color $color")
    
        fun showMessage() = println("showing message")
    
        fun setMessage(text: String) = println("setting message $text")
    
        fun setMessageColor(color: String) = println("setting message color $color")
    
        fun showImage(bitmapBytes: ByteArray) = println("showing image with size ${bitmapBytes.size}")
    
        fun show() = println("showing dialog $this")
    }
    
    //Builder:
    class DialogBuilder() {
        constructor(init: DialogBuilder.() -> Unit) : this() {
            init()
        }
    
        private var titleHolder: TextView? = null
        private var messageHolder: TextView? = null
        private var imageHolder: File? = null
    
        fun title(init: TextView.() -> Unit) {
            titleHolder = TextView().apply { init() }
        }
    
        fun message(init: TextView.() -> Unit) {
            messageHolder = TextView().apply { init() }
        }
    
        fun image(init: () -> File) {
            imageHolder = init()
        }
    
        fun build(): Dialog {
            val dialog = Dialog()
    
            titleHolder?.apply {
                dialog.setTitle(text)
                dialog.setTitleColor(color)
                dialog.showTitle()
            }
    
            messageHolder?.apply {
                dialog.setMessage(text)
                dialog.setMessageColor(color)
                dialog.showMessage()
            }
    
            imageHolder?.apply {
                dialog.showImage(readBytes())
            }
    
            return dialog
        }
    
        class TextView {
            var text: String = ""
            var color: String = "#00000"
        }
    }
    

    Usage

    //Function that creates dialog builder and builds Dialog
    fun dialog(init: DialogBuilder.() -> Unit): Dialog {
        return DialogBuilder(init).build()
    }
    
    val dialog: Dialog = dialog {
    	title {
        	text = "Dialog Title"
        }
        message {
            text = "Dialog Message"
            color = "#333333"
        }
        image {
            File.createTempFile("image", "jpg")
        }
    }
    
    dialog.show()
    

    Output

    setting title text Dialog Title
    setting title color #00000
    showing title
    setting message Dialog Message
    setting message color #333333
    showing message
    showing image with size 0
    showing dialog Dialog@5f184fc6
    

    2、相关书籍

    个人认为还是需要找一本书籍好好地阅读一遍,一下提供了相关书籍可以选择适合自己的。

    NO.1

    《Kotlin for Android Developers》

    Kotlin是编写Android应用程序的新官方语言,多亏了这本书,你很快就能写出代码。直奔主题,实用和完整的例子,它将在开发Android应用程序的同时展示你的语言。学习Kotlin并开始使用这个强大而现代的语言再次享受Android开发。

    NO.2

    《Kotlin开发快速入门与实战》

    学习本书之前不需要具备任何的计算机专业背景,任何有志于APP开发的读者都能利用本书从头学起。

    资深软件开发工程师根据Kotlin最新版本撰写,系统讲解Kotlin开发技巧和项目实战。全书共分为7章,内容层次清晰,难度循序渐进。希望通过阅读本书,能够让你成为一个全栈工程师。

    NO.3

    《疯狂Kotlin讲义》

    本书尤其适合从Java转Kotlin的读者,对于没有Java功底的读者,可忽略“对比”部分,直接学习本书也可掌握Kotlin编程。

    本书对Kotlin的解读十分系统、全面,超过Kotlin官方文档本身覆盖的内容。本书很多地方都会结合Java字节码进行深入解读,比如对Kotlin扩展的解读,对Kotlin主、次构造器的解读,这种解读目的不止于教会读者简单地掌握Kotlin的用法,而是力求让读者深入理解Kotlin,且更好地理解Java。

    NO.4

    《Kotlin实战》

    本书主要面向有一定Java 经验的开发者。

    本书将从语言的基本特性开始,逐渐覆盖其更多的高级特性,尤其注重讲解如何将 Koltin 集成到已有 Java 工程实践及其背后的原理。本书分为两个部分。第一部分讲解如何开始使用 Kotlin 现有的库和API,包括基本语法、扩展函数和扩展属性、数据类和伴生对象、lambda 表达式,以及数据类型系统(着重讲解了可空性和集合的概念)。第二部分教你如何使用 Kotlin 构建自己的 API,以及一些深层次特性——约定和委托属性、高阶函数、泛型、注解和反射,以及领域特定语言的构建。

    本书适合广大移动开发者及入门学习者,尤其是紧跟主流趋势的前沿探索者。

    NO.5

    《揭秘Kotlin编程原理》

    本书深入介绍Kotlin面向对象设计的语法特性及其背后的实现方式。

    在本书中,读者不仅能清晰地了解Kotlin的语法、高级特性,还能真正地掌握Kotlin背后的实现机制和设计哲学,形成对Kotlin语言既直观、又深刻的认识——在此基础上,读者能准确、快速地上手实践,大大提升自己的移动开发能力。

    Kotlin的这些特性和实现机制,可以帮助开发者扫清开发道路上的一些障碍,让开发变得更加简单!本书是一本值得拥有,能切实帮助读者加薪提职的好书!

    项目

    学习一门语言最快的方式就是看其如何在实际项目中运用,有了上面的基础和进阶,下面我们看一些开源项目:

    1.Kotlin-for-Android-Developers(★1676)

    介绍:这个项目其实是Kotlin-for-Android-Developers这本书的配套代码,如果你是kotlin的初学者,那么这绝对是你学习kotlin的不二之选。项目通过一个天气的例子很好的展示了kotlin带来的强大功能,比如网络数据的请求,数据的缓存设计,数据库的操作,各种扩展函数的妙用等等。

    地址:https://github.com/antoniolg/Kotlin-for-Android-Developers

    2.Bandhook-Kotlin (★1494)

    介绍:Kotlin版本的音乐播放器,数据来源于LastFm。

    地址:https://github.com/antoniolg/Bandhook-Kotlin

    3.GankClient-Kotlin (★1216)

    介绍:gank.io kotlin实现的干货集中营Android客户端,风格采用了Material Design。

    地址:https://github.com/githubwing/GankClient-Kotlin

    4.PoiShuhui-Kotlin(★897)

    介绍:一个用Kotlin写的简单漫画APP。

    地址:https://github.com/wuapnjie/PoiShuhui-Kotlin

    5.Eyepetizer-in-Kotlin(★1167)

    介绍:Kotlin版本的Eyepetizer客户端

    地址:https://github.com/LRH1993/Eyepetizer-in-Kotlin

    6.Tucao(★792)

    介绍:Kotlin版本的吐槽客户端

    地址:https://github.com/blackbbc/Tucao

    资源

    一、重要资源

    Kotlin 官网

    https://kotlinlang.org/docs/reference/

    Kotlin 官方网站是学习 Kotlin 好去处。在参考部分,你可以找到该语言的所有概念和功能的深入解析文档。在教程部分有关于设置工作环境并使用编译器的实用分步指南。

    这里还有个 Kotlin 编译器,是一个浏览器 APP,你可以在上面尝试使用这门语言。它能加载许多示例,包括 Koans 课程 — 这是目前熟悉 Kotlin 语法的最好方式。

    Kotlin 官博

    https://blog.jetbrains.com/kotlin/

    Kotlin 的官方博客由 JetBrains 的一位作者负责。你可以在这里找到所有与 Kotlin 相关的新闻、更新、教程、使用技巧等的内容。

    在 Android 上开始使用 Kotlin

    https://developer.android.com/kotlin/get-started.html

    一篇很牛叉的文章,向我们展示了如何使用 Kotlin 编写和运行 Android 应用程序的测试

    从 Java 到 Kotlin

    https://github.com/MindorksOpenSource/from-java-to-kotlin

    实用的快速提醒列表工具包含了一些简短的代码块,藉由这个来帮助你快速找到通用 Java 操作符、功能以及声明的 Kotlin 替代方案。

    Kotlin 教学插件

    https://blog.jetbrains.com/kotlin/2016/03/kotlin-educational-plugin/

    用于 IntelliJ IDEa 的插件,可让你在本地离线环境下使用 Koans 课程。

    Kotlin on GitHub

    https://github.com/jetbrains/kotlin

    Kotlin 于 2012 年开源,你可以对该语言进行贡献。

    Kotlin Android 模板

    https://github.com/nekocode/Kotlin-Android-Template

    Android 项目模板,使其非常容易设置稳定的 Kotlin 工作区,并快速引导你开发应用程序。

    不可错过的 Kotlin 资源列表

    https://github.com/KotlinBy/awesome-kotlin

    这是一个比较完整的 Kotlin 资源列表,包括各种实用链接、书籍、库、框架和视频等。该列表的组织结构非常好,kotlin.link 也提供了一个风格化的版本。

    kotlin设计模式

    https://github.com/dbacinski/Design-Patterns-In-Kotlin

    DariuszBaciński 创建了一个 GitHub repo,其中有在 Kotlin 中实现的常见设计模式,也有用其他语言编写的类似项目,包括 Java,Swift,Java 和 PHP,如果你是其中一项语言的使用者,可以用它们作为参考点。

    二、视频资源

    Kotlin 介绍

    https://www.youtube.com/watch?v=X1RVYt2QKQE

    来自 Google I / O 2017 的演讲,大会首次向人们介绍 Kotlin,并提出了改进工作流程的想法。它涵盖了许多基础知识,并展示了一些很酷的 Kotlin 技巧。

    明日胜于今,我用 Kotlin

    https://www.youtube.com/watch?v=fPzxfeDJDzY

    Google I / O 2017 大会关于 Kotlin 的第二个演讲。这个演讲涵盖了更多高级话题,如设计模式,最佳实践和其他常见规则。 演讲也揭示了在生产中使用 Kotlin 的意义,以及在工作中采用新兴语言将面临的挑战。

    Peter Sommerhoff 教你学 Kotlin

    https://www.youtube.com/playlist?list=PLpg00ti3ApRweIhdOI4VCFFStx4uXC__u

    这是一个免费的 Kotlin 课程,适合初学者,前面介绍了从变量到条件循环和函数的所有基础知识,后面会深入到更高级的主题,如 Kotlin 中的面向对象以及像 lambda 表达式的功能编程。

    使用 Kotlin&Gradle 更好地开发 Android

    https://www.youtube.com/watch?v=_DaZQ374Chc

    这个讲座从 2016 年开始,它介绍了现实世界中的编程语言功能,你将了解到 Kotlin 是如何适应 Android 工作流程中存在的工具。

    使用 Kotlin&Gradle 更好地开发 Android

    https://www.youtube.com/watch?v=ZlQhmkp_jyk

    一个 8 分钟的浓缩教程,让你快速了解 Kotlin 的主要功能,如变量声明、Lambdas、扩展功能等等。

    Jake Wharton:用 Kotlin 进行 Android 开发

    https://www.youtube.com/watch?v=A2LukgT2mKc&t

    关于 Kotlin 的介绍,演讲向我们解释了新语言是如何改进 Android 生态系统的,并展示了许多炫酷的方式,我们可以使用智能的 Kotlin 语法来获得优势。

    扫码关注公众号“伟大程序猿的诞生“,更多干货新鲜文章等着你~

    公众号回复“资料获取”,获取更多干货哦~

    有问题添加本人微信号“fenghuokeji996” 或扫描博客导航栏本人二维码

    我的博客即将同步至腾讯云+社区,邀请大家一同入驻:
    https://cloud.tencent.com/developer/support-plan?invite_code=ncnq0hloo5yw

    展开全文
  • Kotlin Android 官方聊了聊 大家好,我是扔物线朱凯。废话不多说,这次我邀请到了 JetBrains 的范圣佑 Google Android 团队的 Fred 来到...

    跟 Kotlin 和 Android 官方聊了聊

    大家好,我是扔物线朱凯。

    废话不多说,这次我邀请到了 JetBrains 的范圣佑和 Google Android 团队的 Fred 来到我的视频里,一起聊了聊 Kotlin 的未来——以及,Kotlin 在 Android 上的未来。

    对话主要是我问他们答的形式。我问了很多问题,包括但不限于:

    • Kotlin 目前的发展状况如何?

    • 把项目从 Java 迁移到 Kotlin 会有问题吗?

    • Kotlin 的学习和使用遇到障碍该怎么办?

    • Kotlin 有针对 Android 的专门优化吗?

    • Android 团队和 Kotlin 团队是什么关系?

    • Android 会抛弃 Kotlin 吗?

    • Android 会抛弃 Java 吗?

    • Android KTX 未来有什么计划?

    • Jetpack Compose 什么时候正式发布?

    老实说,虽然都是 Android 开发者关心的问题,但我觉得有些问题还是挺直白的。不过很开心,这些问题都得到了来自官方的正面回答。

    到底聊的什么?来看看吧

    扫上面的码就能看视频!

    扫上面的码就能看视频!

    扫上面的码就能看视频!

    第一次和官方约视频,状况出了一大堆,又疲惫又过瘾。如果大家觉得哪里做得不好,都可以直接留言告诉我,你们的意见会对我很有帮助。

    觉得不错?

    那就……关注一下?

    更多干货

    展开全文
  • kotlin 不用findViewById或Butterknife,可以通过插件Kotlin-Android-Extensions之后,直接使用。 原理大概是,看源码会知道,kotlin会自动生成findViewById,然后创建HashMap缓存找到的View,第一次调用为空的时候就...

    只是简单的记录一下

    一。kotlin 不用findViewById或Butterknife,可以通过插件Kotlin-Android-Extensions之后,直接使用。

    原理大概是,看源码会知道,kotlin会自动生成findViewById,然后创建HashMap缓存找到的View,第一次调用为空的时候就会去调用findViewById,然后把id作为key,view作为value,存入map中,第二次使用就直接调用。

    注意的是:fragment必须在OnViewCreated创建之后使用id,不然会出现空指针异常。

    二。kotlin标识符用得多,像是 ?/ !! 在bean类中会用到,判断服务器返回的数据能不能为空。

    三。kotlin允许为空,而java是不允许的。且kotlin代码量少也不需要java的分号,也没有java的new关键字。

    四。kotlin线程调度会使用到写成开发。

    五。kotlin使用语法与前端js相似,都是先使用再声明变量类型。

    待更新。。。

     

     

     

    展开全文
  • Google I / O 2017 宣布了几项重要公告 ,但对我而言,最有趣的一个是Android上的“对Kotlin的一流支持 ”。 关于此公告的Kotlin博客文章讨论了这给Kotlin用户带来的好处: 如果您担心Kotlin支持的其他平台...

    Google I / O 2017 宣布几项重要公告 ,但对我而言,最有趣的一个是Android上的“对Kotlin的一流支持 ”。

    关于此公告Kotlin博客文章讨论了这给Kotlin用户带来的好处:

    如果您担心Kotlin支持的其他平台(服务器和台式机的Kotlin / JVM,Kotlin / JS和Kotlin / Native),请确保它们对我们同样重要。 我们的目标是使Kotlin成为统一应用程序的统一工具,以跨多种平台使用相同语言进行端到端开发。 …对Android的一流支持很可能会将更多的用户吸引到Kotlin,并且我们希望社区能够显着增长。 这意味着在Kotlin中/为Kotlin开发了更多的库和工具,共享了更多的经验,提供了更多的Kotlin职位,发布了更多的学习材料,等等。 我们很高兴看到Kotlin生态系统蓬勃发展!

    Android常见问题解答有关的Kotlin中提到了与本公告相关的有趣点:

    Kotlin的未来是什么? JetBrains对Kotlin设计的周密工作是我们采用该语言的原因之一。 Google正在与JetBrains合作,以确保从语言,框架到工具,整个开发人员都有一个精彩的故事。 并且,我们很高兴能够共同努力,将Kotlin语言转变为非赢利性基金会。

    Kotlin博客文章更详细地描述了Kotlin与Android的未来:

    我们将与Google合作,为Kotlin创建非营利基金会。 语言开发将继续由JetBrains赞助,并且Kotlin团队(超过40人,是公司的第二大团队)将照常运作。 Andrey Breslav仍然是首席语言设计师,而Kotlin将按照与以前相同的原则进行开发。

    Android 3.0 Canary 1 (预览版)目前可从https://developer.android.com/studio/preview/index.html处下载,其中包括Kotlin支持以及其新功能 ,其中包括Java 8支持

    在有关年度重要软件开发的2016年年度职位中,我在“荣誉奖”部分列出了Kotlin相关的开发。 随着Kotlin的这一宣布在Android上得到正式支持,并且该语言被纳入了非营利组织,并获得了Google和JetBrains的支持,我认为Kotlin很有可能会在2017年我的十大软件语言开发方面名列前十。 除了这些公告之外,Kotlin还已经在2017 年的Kotlin 1.1发布了对JavaScript的支持以及Kotlin / Native预览版

    翻译自: https://www.javacodegeeks.com/2017/05/kotlin-android-jetbrains-google-behind-one-language.html

    展开全文
  • 上周,谷歌刚刚推出免费的Kotlin和Android在线课程,教开发者使用Kotlin构建Android应用。很快,GoogleHome团队也现身说法,通过自身经历,展示了Kotlin开发的好处。 GoogleHome应用程序可用来连接并管理各类智能...
    上周,谷歌刚刚推出免费的Kotlin和Android在线课程,教开发者使用Kotlin构建Android应用。很快,GoogleHome团队也现身说法,通过自身经历,展示了Kotlin开发的好处。
    
    GoogleHome应用程序可用来连接并管理各类智能家居设备。与不少受谷歌“Kotlin-first”倡议影响的应用相同,GoogleHome也选择将Kotlin纳入其代码库。截至今年六月,该应用中约有30%的代码采用Kotlin编写,今后的新功能也被鼓励用Kotlin进行开发。
    
    GoogleHome团队提到,与Kotlin配合使用的是同样被谷歌推行的Jetpack开源UI工具包,它结合了反应式编程模型和Kotlin编程语言的简洁性和易用性,旨在简化UI开发。
    

    在这里插入图片描述

    尽管目前只有1/3代码迁移到了Kotlin,其高效和简洁的特性已使GoogleHome团队感受颇深。他们以数据类和Parcelize插件的使用为例证:在Java中由126行手写代码组成的类,在Kotlin中仅用23行就能够表示——代码量减少了80%。此外,Kotlin中一些函数方法还简化了许多嵌套循环和过滤检查。
    
    另一方面,Kotlin的可空性(nullability)也得到了赞许。依旧是与Java相比,GoogleHome团队指出,“Java中对可空性注释的用法不一致时,可能会导致遗漏一些bug”。而采用Kotlin以来,GoogleHome的NullPointerExceptions减少了33%,这恰是GooglePlay控制台上最常见的崩溃类型,由此带来的崩溃数量减少也许能够显著改善用户体验。
    
    Kotlin编程语言2011年由JetBrains推出,2012年开源,2017年成为Android官方开发语言,并于2019年成为Andoid开发官方首选语言。
    
    从初始支持Kotlin再到“Kotlin-first”,谷歌一直在对其进行多方位扶持,先后推出了Kotlin免费在线课程和使用Kotlin构建Android应用的课程;同时不断完善着相关生态,比如今年四月开源了gRPC-Kotlin/JVM,让开发者可以在Kotlin项目中更方便地使用gRPC。
    
    随着谷歌的极力推行,Kotlin的关注度一路水涨船高,最新的JVM生态报告显示,Kotlin已成为第二受欢迎的JVM语言。Android开发专家沈哲在接受开源中国的采访时曾提到,国内一些公司也开始使用Kotlin开发Android项目,“越来越多的开发者会选择Kotlin作为原生App的首选开发语言”。
    
    作为一门JVM语言,一门兼容甚至被认为要取代Java的语言,Kotlin的出场也往往伴随着与Java的比较。谷歌甚至推出了从Java迁移到Kotlin的官方指南。部分Android开发者仍在犹豫是否要转到Kotlin,有一些人已经从Java迁移到Kotlin又迁回了Java。在一年前Dice网站发布的调查中,85%的受访者几乎一边倒地选择仍旧使用Java来构建Android应用程序。
    
    但其实在谷歌工程师看来,并没有必要将二者完全划清界限。AndroidStudio技术负责人JeffreyvanGogh就曾讲过,Java与Kotlin具有极高的互操作性,所以两者完全可以共存于同一个项目中。目前如GoogleHome这样的谷歌自家应用,不少都采用这种融合式做法,Kotlin更多地被用来编写新功能。
    
    那么,再回到“Kotlin还是Java”这个也许已经令Android开发者感到厌烦的问题上,定论显然并不存在,关键是选择最适合的方式。
    
    展开全文
  • 基础篇:Kotlin与Java相互调用 ...分别实例化对象调用静态方法(Kotlin调用java)   注意Koltin静态方法声明分为两个一种了Companion obje{}进行包裹的静态方法这种写法称为局部静态而通过ob
  • 首先声明,博主是一个小白,觉得技多不压身,就想学习一下Kotlin,本文记录如何在Android Studio中配置Kotlin环境。如有错误,敬请指正,谢谢。  同时,这段时间也在学习 第一行代码第二版 ,接下来的文章将把用...
  • 使用Kotlin开发Android应用初体验昨晚,最近一届的谷歌IO大会正式将Kotlin确定为了官方开发语言,作为一名Android开发鸟,怎么能不及时尝尝鲜呢?Kotlin的简要介绍在开发之前,很多同学一定有很多疑问,Kotlin到底有...
  • Kotlin plugin should be enabled before 'kotlin-android-extensions' 在另一台电脑没有这个问题。 'kotlin-android'需要放在'kotlin-android-extensions'的前面
  • 前言2017 Google I/O大会宣布将Kotlin语言作为安卓开发的一级编程语言。Kotlin由JetBrains公司开发,与Java 100%互通,并具备诸多Java尚不支持的新特性。谷歌称还将与JetBrains公司合作,为Kotlin设立一个非盈利基金...
  • 构建Android应用程序,学习流行的Kotlin编程语言API的要点。这本书将教你关键的Kotlin技能技术,对于创建您自己的Android应用程序非常重要。除了介绍kotlin编程之外,学习kotlin for android Development还强调...
  • 最新Kotlin for Android系列视频教程
  • Kotlin plugin should be enabled before 'kotlin-android-extensions' 在另一台电脑没有这个问题。 'kotlin-android'需要放在'kotlin-android-extensions'的前面
  • Kotlin Android Extensions是另一个Kotlin团队研发的插件,让我们用更少的代码来开发程序 。 当前仅仅包括了view的绑定。该插件自动创建了很多的属性来让我们直接访问XML中的view。因此不需要你在布局中去找到这些...
  • 资源包包含Kotlin官方中文文档,Kotlin-for-Android中文文档
  • Google 在今年 I/O 2017 开发者大会中宣布,正式把 Kotlin 纳入 Android 程序的一级开发语言(First-class language)。并且,Android Studio 3.0将会支持Kotlin,不用再安装额外插件。 Kotlin 主要由 JetBrains 开发...
  • Kotlin-Android-Studio-Templates,Kotlin Android Studio模板-Kotlin中的模板集合.zip
  • kotlin-android-extensions用于扩展绑定关系,为了解决findViewById()的问题。背景Android开发中,findViewById()是比较烦人的一个函数,开源界已经有几个库提供了解决办法,比如:ButterKnife,DataBinding等。...
  • Kotlin 从首次推出到现在,可谓发展的十分迅速,独特的空安全特性吸引了很多 Android 开发者去使用,Google 也正式将 Kotlin 这门语言作为 Android 开发的首选语言。Kotlin 官方也为各位开发者提供了一系列的插件,...
  • Kotlin for Android

    2017-05-22 18:19:35
    在Google IO 2017 大会上,Google将 Kotlin列为 Android官方开发语言,Android Studio 3.0 也默认集成了Kotlin插件。Android Studio 3.0目前是预览版,下载地址: ...
1 2 3 4 5 ... 20
收藏数 35,616
精华内容 14,246
关键字:

kotlin和android