當前位置:
首頁 > 最新 > Kotlin實戰學習:擼一個程序猿老黃曆

Kotlin實戰學習:擼一個程序猿老黃曆

Talk is cheap, let"s code

前面一篇文章介紹Kotlin的基礎知識,但光有知識是不夠的,最重要的是要能在實戰中使用Kotlin,這才不枉我們學習一回。這裡就用純Kotlin來開發一個簡單的Android應用,以展示如何在實際項目中使用Kotlin。


在前面文章的尾部,我們展示了如何創建一個基於Kotlin安卓應用,但是過於簡單,因為僅是代碼換成了Kotlin,布局還是在用XML,這並沒有用到Kotlin的全部。為了更加方便的開發Android應用,發揮Kotlin語言的巨大優勢,JetBrains在發布Kotlin的同時,也發布一個專門用於Android開發的配套的庫Anko,它最大的優勢就是以DSL的方式來創建UI,下面我們來介紹一下Anko。


Anko庫的目的是提高Android開發的效率,用Kotlin語言的優勢。它有四大部分:Anko commons,Anko layouts,Anko SQLite和Anko Coroutines,這裡我們不複製官方的介紹了,關於這四部分可以看一下官方的wiki。其實,最大的變化就是布局,常規的Android項目,我們一般都是用XML來寫布局XML呢,其實也沒有啥大問題,在各種開發工具和開源庫的幫忙下,效率也不低,但XML最大的問題就是啰嗦,要不然現在也不會被JSON取代。當然,我們可以像前面的KotlinHello,顯示的那樣,布局使用XML,代碼使用Kotlin,這沒有任何問題,但Kotlin語言最大的特點是簡潔,所以,使用Anko可以,非常簡潔的,用更少的代碼來實現同樣的功能,代碼少了,效率也就高了。


重寫KotlinHello,來展示一下如何在項目中使用Anko,繼續打開上篇文章中的KotlinHello項目,在app下面的build.gradle中的dependencies中添加:

在其頂部定義anko_version變數:

重新gradle sync一下,完成後,就可以使用了。

編輯HelloActivity.kt,在onCreate裡面,把除了super.onCreate以外的都刪除,然後添加:

運行起來,就是這個樣子的:

GIF

面有點丑,稍美化下,展示如何添加布局的屬性:

最終就是這個樣子了:

GIF

下完整代碼:app/build.gradle:

HelloActivity.kt:


一個KotlinHello,還是過於toy,我們再來一個稍複雜點的小項目,以練手,考慮到Kotlin帶來最大變化就是用Anko來寫布局,所以我們弄個布局稍複雜的,所以,可以擼一個程序猿老黃曆,它功能比較簡單,主要就是布局,又不涉及網路,所以適合初學者練手。


動手之前,先理解一下需求。我們要擼的是這個版本的程序員老黃曆。原理呢很簡單,預定義一些事件,工具,飲品,方位等,然後用當前日期算出一個隨機index,從預定義中取出一批,然後展示出來。其實呢,對於邏輯部分的代碼,我們照抄就好,不用太關心。重點,是布局如何用Anko來實現。


新建一個package: calendar

calendar中新建一個empty activity: CalendarActivity

點擊KotlinHello中的button時,跳到CalendarActivity

開始擼布局 整體布局分五塊:頭部的日期,宜事抬頭,宜事詳細,壞事抬頭,壞事詳細,底部方向和指數。這其中,頭部日期,可以用一個TextView來解決。宜和壞,是一樣的,可以復用,宜(壞)事詳細是一個列表,底部也是一個列表,但因為數目和每條內容是固定的,所以可以用三個View來解決。

總結:

根布局要是一個ScrollView,因為如果內容多時,或者屏幕太小時,可能會有超出屏幕的地方,所以根布局要能滑動。

中間好/壞, 以及好壞的具體事件,要用一個LinearLayout把兩個包起來,因為好/壞的高度是由具體事件決定的,又要填充背景色,所以包上一層LinearLayout不可避免。

這樣一來,從上到下,一個LinearLayout就可以了


最終運行效果:


CalendarActivity,負責布局和展示

ProgrammerCalendar,這裡是業務邏輯

完整的代碼可以到這裡https://github.com/alexhilton/KotlinHello。

從代碼中看到,除了上一篇文章外,還用到了一些Kotlin語言的特性:

Ranges

可以理解為區間,用於按某些範圍來迭代,看一下例子中genTodayLuck方法就能明白。下面也簡單的補充下:

自己可以體會上面的兩個不同,還有就是還可以用於if判斷:

默認步長是1, 當然也可以自定義:

Extension function

可以給已存在的類添加方法,非繼承也非組合的方式,與Object-C中的Category很像。這會讓在基於某個類,執行某種操作時,非常的簡潔,比如此例中的pickRandom方法,如果常規實現是把列表作為一個參數傳入,但是用了Extension function後,使用的時候就彷彿這是Collection本身提供的一個方法一樣,可讀性與簡潔性大大提升。

Companion object

與內部類概念類似,就是想在一個類的內部再聲明一個類,就要用companion object,引用companion object的成員時可以省略它的類的名字,如示例中,在CalendarActivity中引用ProgrammerCalendar的companion object EventKeys時可以省略:

const關鍵字

上一篇文章,介紹過變數用var聲明,常量用val來聲明,那關鍵字const又是什麼鬼呢?原來它用於聲明類的頂級屬性(用人話說,就是非內部類),其作用相當於Java中的static final:


Building a UI with Kotlin and Anko


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 稀有猿訴 的精彩文章:

TAG:稀有猿訴 |