Kotlin從入門到掉坑裡

来源:http://www.cnblogs.com/sw926/archive/2016/09/14/5870326.html
-Advertisement-
Play Games

為什麼要用Kotlin,和Java完全相容,相互之間引用完全不是問題,所有沒有什麼負擔。 使用Kotlin已經近一個月,基本上看完了語法就上正式項目了,期間幾次準備放棄,最終堅持下來了。關於Kotlin的優點,不必多說了,基於這一個月的經驗,來說說Kotlin的入門和坑。 配置工程 添加依賴 作為一 ...


為什麼要用Kotlin,和Java完全相容,相互之間引用完全不是問題,所有沒有什麼負擔。
使用Kotlin已經近一個月,基本上看完了語法就上正式項目了,期間幾次準備放棄,最終堅持下來了。關於Kotlin的優點,不必多說了,基於這一個月的經驗,來說說Kotlin的入門和坑。

配置工程

添加依賴

作為一個Android碼農,使用Kotlin很簡單,首先在Android Studio中安裝Kotlin插件,在Browse repositories中搜索Kotlin,安裝人數最多的那個就是。
安裝完成之後,連續按4下shift鍵,輸入config kotlin 進行搜索,選擇Config Kotlin in Project,選擇Android Gradle,選擇app module,工程就配置完成。

轉換Java到Kotlin

連續按4下shift鍵,輸入Convert Java Files 進行搜索,選擇Convert Java Files to Kotlin Files,可以自動將Java轉換為Kotlin

入門

變數聲明

  • var 可變變數
  • val 不可變變數

聲明變數的格式

var str: String

Kotlin不允許聲明變數但不初始化,以String為例,以下三種初始化方式

賦非空值

var str: String = ""

設為null

var str: String? = null

強制設為null

var str: String = null!!

Kotlin是空安全的,但是第三種是例外情況,如果給一個變數賦值為null!!,那麼就等於聲明這個變數不是空安全的,就算這樣使用

var str:String = null!!
str.length

編譯器也不會報錯

第一種方式,賦值之後不能將str設為null或其他String?的值,否則編譯器會報錯,第二種方式,每次使用時必須要進行檢查,直接使用的話編譯器會報錯,這樣就保證了空安全。舉個例子:

var str: String = ""
// str 不是空的,可以直接使用不必檢查是否為空
// 可以隨意給str賦非空值
str = "hello kotlin"

// 這樣編譯器是會報錯的
str = null

// 如果強制設為null,str就不再是空安全的,編譯也就不會檢查str了
str = null!!

// 聲明str2為可空的變數,str2也是空安全的
var str2: String? = null

// 直接使用str2編譯器會報錯
str2.length
// 可以這樣用
str2?.let {
    log(str2)
}

// str2賦值給str也會報錯

最後達到的目的就是,使用一個空變數會報錯,使用一個可能為空的變數不檢查也會報錯,如果覺的檢查是否為空太麻煩了,Kotlin支持

if (result?.data?.item?.name != null) {
    log(result?.data?.item?.name)
}

lamda

神奇的it

Kotlin的lamda表達式很簡潔,設置OnClickListener

textView.setOnClickListener {
    view -> openActivity(view.context)
}

只有一個參數的時候,是可以隱藏的,用it

textView.setOnClickListener {
    openActivity(it.context)
}

多個參數的時候

checkbox.setOnCheckedChangeListener { compoundButton, b ->
}

Kotlin的函數可以作為參數,寫callback的時候,可以不用interface了

// 聲明一個callback
var callback: (()->Unit)? = null
// 判斷並使用
callback?.invoke()

// 想帶參數
var callback: ((str: String)->Unit)? = null
// 判斷並使用
callback?.invoke(str)

// set callback
item.callback = {
    // do something
}
// 帶參數的callback
item.callback = {
    doSomething(it)
}

遇到的坑

Databinding

需要在app moudle的build.gradle裡面添加

kapt {
    generateStubs = true
}
dependencies {
    kapt 'com.android.databinding:compiler:2.2.0-rc2'
}

2.2.0-rc2 這個版本號必須要和根目錄下的build.gradle文件內的com.android.tools.build:gradle:2.2.0-rc2 版本號一致

Dagger2

官方博客說是支持Dagger2的,但實際遇到的情況是和Databinding結合使用有問題

奇怪的報錯

使用Databinding,設置ViewModel時

cannot access class '...'. check your module classpath for missing or conflicting dependencies

應該是Kotlin的bug,只是報錯,不影響編譯,如果不希望提示錯誤,可以添加
@Suppress("MISSING_DEPENDENCY_CLASS")

編譯的時候報找不到class的問題,clean一下就好,不知道什麼原因

不知道代碼怎麼寫

Java的代碼提示很方便,setListener,基本只用輸入new,按代碼提示回車就自動完成了,匿名函數應該怎麼寫呢

 textView.setOnClickListener(object: View.OnClickListener {
            override fun onClick(v: View?) {
            }
})

靜態變數應該怎麼寫呢

class A {
    companion object {
        val TAG = "classA"
    }
}

// 在Java代碼中使用
A.Companion.getTAG()

怎麼從Kotlin轉為Java

兩種方法

  • 打包,輸出apk,使用dex2jar將apk代碼文件提取成jar,使用jd-jui查看,將對應的代碼拷貝出來,修改,使用
  • 把Kotlin文件刪掉,用Java重寫一遍

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [1]頁面設計 [2]菜單邏輯 [3]功能實現 [4]完整源碼 ...
  • 在IE8以認為只有文本標簽才有name屬性的,一些元素標簽用document.getElementsByName獲取不到DOM,如DIV,span等,這裡做一下相容。 HTML: 相容JS: 測試JS: ...
  • getElementsByClassName是通過class來獲取DOM,但是IE8及以下不能相容。這裡做了一下相容性。 HTML: 相容JS: 測試: 結果: IE7谷歌火狐 ...
  • “正則表達式”描述在搜索文本正文時要匹配的一個或多個字元串。 該表達式可用作一個將字元模式與要搜索的字元串相匹配的模板。 正則表達式包括普通字元(例如,a 到 z 之間的字母)和特殊字元(稱為“元字元”)。 特殊字元 若要匹配這些特殊字元之一,必須首先轉義字元,即,在字元前面加反斜杠字元 (\)。  ...
  • 在資料庫獲取一些新聞時,有時文字過多,為了不破壞佈局,常常需要只顯示一部分,這是需要用到文字截斷的功能。雖然css也可以實現,但是限制太多 css實現需要text-overflow:ellipsis;overflow:hidden;white-space:nowrap;三個屬性,另外還需要文本標簽寬 ...
  • CSS3實現輪播圖主要是由css:background-position和css3:animation實現。且實現此輪播需要一張四個圖橫著相連的圖片。 註(Internet Explorer 10、Firefox 以及 Opera 支持 animation 屬性。Safari 和 Chrome 支持 ...
  • 給自己定一個小目標,一個禮拜完成100個inkscape案例。 今天完成picture on the wall ...
  • 前言: 最近一個多月在認真的學習Android和做項目,文章內容表達的不好或者理解錯了,希望大家評論指出。 :-) 本文是總結幾個比較常用且使用的技巧,和一個大家都會遇到的問題。 文章中大部分語句摘抄自一下兩篇大神寫的文章:(如果對ExpandableListView一無所知,建議按照順序去閱讀,遇 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...