Kotlin學習之旅(D9)-Android Extensions

Kotlin學習之旅第九天

今天的主題是 - -Android Extensions

前言

Kotlin學習之旅(D1)-學習計劃&基本語法

Kotlin學習之旅(D2)-基本語法

Kotlin學習之旅(D3)-類與繼承

Kotlin學習之旅(D4)-函數與Lambda表達式

Kotlin學習之旅(D5)-高級語法

Kotlin學習之旅(D6)-Kotlin Idioms part 1

Kotlin學習之旅(D7)-Kotlin Idioms part 2

Kotlin學習之旅(D8)-From Java to Kotlin

Android Extensions 是什麼

Kotlin Android Extensions 是 Kotlin 團隊開發的一個插件,目的是讓我們在開發過程中可以減少代碼的編寫量。主要的功能就是:視圖綁定

在Java中,我們經常要寫的一句代碼就是 findViewById(),但是在一個Layou有許多View存在的情況下,重複寫這句代碼不僅工作量大,而且可讀性差,因此各路大神發揮智慧,推出了許多的第三方庫,其中最著名的就是ButterKnife了 ,但是使用ButterKnife有個不好的地方,就是需要定義成員變量,代碼量和原生的方式差不多。

現在 Kotlin Android Extensions 能夠提供與這些開源庫功能相同的體驗,並且不需要添加任何額外代碼。

Android Extensions 怎麼用

1.在Moudle中的build.gradle文件添加插件配置

apply plugin: 'kotlin-android-extensions'

2. 在View中引入資源文件

import kotlinx.android.synthetic.main.activity_main.*

3.訪問id

import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
		// 1
        btn_login.setOnClickListener {
            Toast.makeText(this@MainActivity,"Android Extensions test",Toast.LENGTH_SHORT).show()
        }
    }
}
  1. 通過btn_login.setXXX 的方式來訪問view,並且調用view相關方法,不需要寫findViewById()

import格式

import格式是這樣的:kotlinx.android.synthetic.main.佈局名稱.*。需要注意的是include進來的佈局,也是需要通過import導入相應佈局,這樣才能正常使用。

ViewHolder 使用Extensions

剛開始的時候Extensions是不支持在ViewHolder中使用視圖綁定的,因此還是需要些findViewById,但是從Kotlin 1.1.4起,Extensions加入了增強功能,由於這項功能還未正式發佈,因此需要開啓實驗標誌

####1.開啓experimental

在Module的build.gradle文件中設置:

androidExtensions {
    experimental = true
}

2.編寫ViewHolder

import android.support.v7.widget.RecyclerView
import android.view.View
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.activity_main.*

class ViewHolder constructor(override val containerView: View?)
    : RecyclerView.ViewHolder(containerView),
      LayoutContainer {   // 1

    fun setContent(str: String) {
        helloTv.text = str   // 2
    }
}
  1. 實現LayoutContainer
  2. 使用helloTv.text

3. 什麼是LayoutContainer

在Activity,Fragment,View中我們知道import對應的layout就可以了,但是像ViewHolder這些特殊的,我們就需要通過實現LayoutContainer接口,接口返回一個containerView,按照字面意思理解就是內容視圖,這個containerView就包含了ViewHolder裏面的所有子View,因此可以直接使用view.setxxx / view.property 的寫法

Android多渠道版本

Android Extensions 插件支持Android 多渠道版本,假如在你的build.gradle中有一個名爲free的版本

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. 用方法調用替換每一個屬性調用。

例如:

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

總結

Kotlin Android Extensions 的主要功能其實就是視圖綁定,但是這一個功能也可以減少許多重複代碼的編寫,因此有機會還是把這個插件用上吧~

Day 9 - Learn Kotlin Trip, Completed.


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