用 Kotlin 開啓我們的 Activity

Upload fengjing04.jpg failed. Please try again.]![Uploading fengjing04_157688.jpg ...]![

點此進入:從零快速構建APP系列目錄導圖
點此進入:UI編程系列目錄導圖
點此進入:四大組件系列目錄導圖
點此進入:數據網絡和線程系列目錄導圖

Kotlin中的類遵循一個簡單的結構。儘管與Java有一點細微的差別。你可以使用try.kotlinlang.org在不需要一個真正的項目和不需要部署到機器的前提下來測試一些簡單的代碼範例。

一、開啓Activity前的知識預備

1、怎麼定義一個類

如果你想定義一個類,你只需要使用class關鍵字:

class MainActivity{

}

它有一個默認唯一的構造器,我們會在以後的篇幅當中學習在特殊的情況下創建其它額外的構造器,但是請記住大部分情況下我們只需要這個默認的構造器。我們只需要在類名後面寫上它的參數,如果這個類沒有任何內容可以省略大括號:

class Person(name: String, surname: String)

那麼構造函數的函數體在哪呢?我們可以寫在init塊中:

class Person(name: String, surname: String) {
    init{
        ...
    }
}

2、類繼承的實現

默認任何類都是基礎繼承自 Any(與java中的Object類似)的,但是我們也可以繼承其它類。所有的類默認都是不可繼承的(final),所以我們只能繼承那些明確聲明 open 或者 abstract 的類:

open class Animal(name: String)
class Person(name: String, surname: String) : Animal(name)

當我們只有單個構造器時,我們需要在從父類繼承下來的構造器中指定需要的參數,這是用來替換 Java 中的 super 調用的。

3、如何定義一個函數

函數(我們Java中的方法)可以使用fun關鍵字就可以定義:

fun onCreate(savedInstanceState: Bundle?) {
}

如果我們沒有指定它的返回值,它就會返回Unit,與Java中的void類似,但是Unit是一個真正的對象。我們當然也可以指定任何其它的返回類型:

fun add(x: Int, y: Int) : Int {
    return x + y
}

注意:分號不是必須的
就像你在上面的例子中看到的那樣,我在每句的最後沒有使用分號。當然你也可以使用分號,分號不是必須的,而且不使用分號是一個不錯的方式,因爲這會節約我們很多時間。

然而如果返回的結果可以使用一個表達式計算出來,你可以不使用括號而是使用等號:

fun add(x: Int,y: Int) : Int = x + y

4、構造方法和函數參數

Kotlin 中的參數與Java中有些不同。如你所見,我們先寫參數的名字再寫它的類型:

fun add(x: Int, y: Int) : Int {
    return x + y
}

我們可以給參數指定一個默認值使得它們變得可選,這是非常有幫助的。這裏有一個例子,在Activity中創建了一個函數用來toast一段信息:

fun toast(message: String, length: Int = Toast.LENGTH_SHORT) {
    Toast.makeText(this, message, length).show()
}

正如我們看見的,第二個參數(length)指定了一個默認值。這意味着我們調用的時候可以傳入第二個值或者不傳,這樣可以避免我們需要的重載函數:

toast("Hello")
toast("Hello", Toast.LENGTH_LONG)

這個與下面的Java代碼是一樣的:

void toast(String message){
}

void toast(String message, int length){
    Toast.makeText(this, message, length).show();
}

再看看這個例子:

fun niceToast(message: String,
                tag: String = javaClass<MainActivity>().getSimpleName(),
                length: Int = Toast.LENGTH_SHORT) {
    Toast.makeText(this, "[$className] $message", length).show()
}

我增加了第三個默認值是類名的tag參數,如果在Java中總數開銷會以幾何增長,現在可以通過以下方式調用:

toast("Hello")
toast("Hello", "MyTag")
toast("Hello", "MyTag", Toast.LENGTH_SHORT)

而且甚至還有其它選擇,因爲我們可以使用參數名字來調用,這表示我們可以通過在值前寫明參數名來傳入我們希望的參數:

toast(message = "Hello", length = Toast.LENGTH_SHORT)

注意:關於String模版
我們可以在String中直接使用模版表達式。它可以幫助我們很簡單地在靜態值和變量的基礎上編寫複雜的String。在上面的例子中,我們使用了”[className] message”。

任何時候我們使用一個使"Yournameis {user.name}”。

二、編寫我們的第一個類

我們之前已經定義了 MainActivity.kt 這個類,這個 Activity 會展示請求的數據,所以它的 layout 需要定義這些內容:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/testtList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipToPadding="false"
        android:paddingTop="?attr/actionBarSize"/>

    <include layout="@layout/toolbar"/>

</FrameLayout>

列表我們使用 RecyclerView,所以我們需要在build.gradle中增加一個新的依賴:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile "com.android.support:appcompat-v7:$support_version" 
    compile "com.android.support:recyclerview-v7:$support_version"
}

然後我們在 Mainactivity.kt 中使用老的 findViewByid() 的方式找到並加載佈局:

val forecastList = findViewById(R.id.forecast_list) as RecyclerView
forecastList.layoutManager = LinearLayoutManager(this)

正如我們所看到的,我們通過 findViewById() 找到了 R.id.forecast_list 這個佈局並轉型爲 RecyclerView。這裏與 Java 有點不同,我們會在後面的文章中分析這些不同之處。LayoutManager 會通過屬性的方式去設置,而不是通過 setter,現在這個 layout 已經足夠顯示一個列表了。

**注意:**Kotlin中的對象實例化
Kotlin中的對象實例化也是與Java中有些不同,我們去掉了new關鍵字,這時構造函數仍然會被調用,但是我們確可以省略四個字符,LinearLayoutManager(this) 創建了一個對象的實例。

點此進入:GitHub開源項目“愛閱”。“愛閱”專注於收集優質的文章、站點、教程,與大家共分享。下面是“愛閱”的效果圖:


聯繫方式:

簡書:WillFlow
CSDN:WillFlow
微信公衆號:WillFlow

微信公衆號:WillFlow

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章