Kotlin Android擴展使用及流行框架支持打賞

接上篇,整理一下Kotlin在Android平臺上應用的一些實例及方法。

Kotlin Android Extensions

Kotlin針對Android提供了Kotlin Android Extensions,可以很大程度上增強Android的開發體驗。
背景
相信每個Android開發人員都很清楚findViewById()函數,并且備受摧殘,毫無疑問,大量的findViewById()會造成代碼閱讀上的干擾和錯誤定位的難度,雖然有類似Butterknife之類的庫可以通過注解實現綁定,但在實際使用過程中還是要為每個變量增加注解,倘若出現大量注解,維護難度應該不亞于直接編碼,而其優點無非是代碼看起來簡潔了,但整體看似乎并不是特別優雅,且需要增加額外的運行庫。

現在,Kotlin Android Extensions插件給我們提供了更優雅的方法,且不需要額外引入運行庫,比如,我們的代碼可以像下面這樣寫:

// Using R.layout.activity_main from the main source set
import kotlinx.android.synthetic.main.activity_main.*

class MyActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView.setText("Hello, world!")
        // Instead of findViewById(R.id.textView) as TextView
    }
}

其中,textView是Activity的一個擴展屬性,它的類型與activity_main.xml中資源id類型相同。
使用Kotlin Android擴展
1、配置依賴關系

Android擴展程序是Kotlin IDEA插件的一部分,所以你不需要安裝其他插件,只需在需要的時候在項目本地build.gradle文件中啟用Android Extensions Gradle插件:

apply plugin: 'kotlin-android-extensions'

2、導入合成屬性

可以通過如下方式一次性導入某個布局下所有資源作為合成屬性:

import kotlinx.android.synthetic.main..*

例如:如果布局文件名為activity_main.xml,我們將導入kotlinx.android.synthetic.main.activity_main.*,如果你需要在View上調用合成屬性(在Adapter中比較有用),我們還應該導入kotlinx.android.synthetic.main.activity_main.view.*。這樣之后我們即可直接使用合成屬性(為了代碼規范,建議在xml中id命名使用駝峰寫法),例如:

<TextView
	android:id="@+id/textView"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:text="Hello World, MyActivity"
/>

Activity中就會有一個名為textView的屬性,代碼可以這樣寫:

this.textView.setText("Hi!")

但如果xml內定義id為text_view,代碼就只能替換為:

this.text_view.setText("Hi!")

Android Flavors
Kotlin Android Extensions同樣支持Android的差異化打包。假設你的build.gradle文件中有一個名為free的productFlavors配置:

android {
    productFlavors {
        free {
            versionName "1.0-free"
        }
    }
}

你可以通過如下方式導入free/res/layout/activity_free.xml布局的所有合成屬性:

import kotlinx.android.synthetic.free.activity_free.*

底層實現
Kotlin Android Extensions是Kotlin編譯器的插件,它主要做了兩件事:

1、在每個Kotlin Activity中添加一個隱藏的緩存功能和一個字段。方法很小,所以它不會增加APK的大小。
2、用函數調用替換每個合成屬性調用。

原理是依托Kotlin動態擴展類(實際并未擴展,只是編譯器以及IDE做了一些偽裝)的特性給Activity增加合成屬性,當調用合成屬性時,如果接收方是Kotlin Activity或Fragment類,緩存函數將被調用。例如給定

class MyActivity : Activity()
fun MyActivity.a() { 
    this.textView.setText("")
}

在MyActivity內部會生成隱藏的緩存功能,所以在可能的情況,底層會使用緩存機制以提高效率。

但在以下情況下:

fun Activity.b() { 
    this.textView.setText("")
}

無法知道這個函數是Kotlin Activity還是Java Activity。因此,即使接收器是上一個示例中的MyActivity,也不會緩存。

框架支持

和其他語言類似,Android開發界也有許多為簡化開發而生的流行框架,在切到Kotlin開發的同時,依然可以使用相同的框架,但因為這些框架都是基于Java的,所以使用上還是有些小差異,常用的諸如Dagger,Butterknife(上面提到的Kotlin Android Extensions配合Anko已經可以覆蓋此框架功能,如果不介意可以考慮替換),Data Binding,Auto-parcel和DBFlow等都可以通過注釋處理。在Kotlin中,你可以使用Kotlin注釋處理工具(kapt)以類似于Java annotationProcessor的方式指定依賴關系。

需要使用時可以導入

apply plugin: 'kotlin-kapt'

其他注解方式基本無異,個別情況下,只需根據Kotlin語言特性對注解的位置及代碼的形式做些許調整,關于這些框架的支持可以參考官網,鏈接見文章末尾。

參考:
http://kotlinlang.org/docs/tutorials/android-plugin.html
http://kotlinlang.org/docs/tutorials/android-frameworks.html

Kotlin Android擴展使用及流行框架支持
文章《Kotlin Android擴展使用及流行框架支持》二維碼
  • 微信打賞
  • 支付寶打賞

已有4條評論

  1. 盧松松博客

    這個分享的不錯,回頭試一試。

    2017-08-18 16:08 回復
  2. 增達網

    如果上天再給我一次機會,我會對你的博客說,下次還來看你!

    2017-08-18 10:06 回復
  3. 游客 123

    感謝分享!

    2017-08-11 17:44 回復
  4. 游客 438

    站長是程序員?

    2017-07-31 11:44 回復

(必填)

(必填)

(可選)

黑龙江22选5开奖