Data Binding 詳解(七)-在 Kotlin 中的使用

知是行之始,行是知之成。
文章配套的 Demohttps://github.com/muyi-yang/DataBindingDemo
Demo 支持 Java 和 Kotlin 雙語言,master 分支為 Java 語言代碼,kotlin 分支為 Kotlin 語言代碼。

在 Google 官方宣布 Android 支持 Kotlin 語言后,Kotlin 瞬間席卷了整個(gè) Android 圈,各種文章書籍,學(xué)習(xí)小組應(yīng)時(shí)而生。時(shí)至今日已有很大一部分先行者已經(jīng)使用 Kotlin 開發(fā)自家的商業(yè)項(xiàng)目,在此期間我也是 Kotlin 的學(xué)習(xí)者之一,且在公司多個(gè)商業(yè)項(xiàng)目中使用 Kotlin 語言(100%)編寫。這篇作為 DataBinding 的結(jié)尾篇,我將講解如何在 Kotlin 項(xiàng)目中使用 DataBinding。如果你還不了解 Kotlin,你可以查看 Kotlin 官網(wǎng),也可以學(xué)習(xí) Google 官方的 Kotlin 示例

以下操作是在 Android Studio 3.3.1 下完成的,Android Studio 是從 3.0 版本開始默認(rèn)支持 Kotlin 開發(fā),如果你是 Android Studio 3.0 以下版本,需要安裝 Kotlin 插件才能正常使用。

新建 Kotlin 項(xiàng)目

在 Android Studio 3.0 及以上可以直接創(chuàng)建一個(gè) Kotlin 項(xiàng)目,在項(xiàng)目創(chuàng)建界面新增了一個(gè) Language 選項(xiàng),你可以選擇 Java 或者 Kotlin 語言進(jìn)行項(xiàng)目創(chuàng)建,如下圖:
image.png

在項(xiàng)目創(chuàng)建好后你可以看到熟悉的 MainActivity 已不再是 .java 后綴了,它是 .kt 后綴,項(xiàng)目已經(jīng)完全是 Kotlin 語法了,如下圖:
image.png

項(xiàng)目中的 Gradle 配置也有了新的變化,項(xiàng)目根目錄下的 build.gradle 中增加了 Kotlin 插件,如下:
buildscript {
    ext.kotlin_version = '1.3.41'
    ...
    dependencies {
        ...
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}

以及 module 下 build.gradle 中增加了新的依賴:

...
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
...
dependencies {
    ...
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

這樣的項(xiàng)目就可以使用 Kotlin 語言開發(fā)了,當(dāng)然這個(gè)項(xiàng)目依然支持 Java 語言,你完全可以在此項(xiàng)目中使用 Java 和 Kotlin 進(jìn)行混合開發(fā),因?yàn)?Kotlin 語言可以無縫的支持 Java 開發(fā)。你也可以查看 Kotlin 官方文章《Android 與 Kotlin 入門》來了解如何和使用 Kotlin。

已有項(xiàng)目開啟 Kotlin 配置

如果你想在已有的老項(xiàng)目中使用 Kotlin,你只需要將上面講的 Gradle 配置加上即可。加上后編譯通過就可以創(chuàng)建 Kotlin 文件了,比如:
image.png

對(duì)于老的 Java 文件 Android studio 也提供了一鍵轉(zhuǎn)換成 Kotlin 代碼的工具,使用方法是選中你想轉(zhuǎn)的 Java 文件,點(diǎn)擊 Code > Convert Java File to Kotlin File,就這么簡(jiǎn)單,一鍵轉(zhuǎn)換成了 Kotlin 代碼。但是這個(gè)可不是萬能的,畢竟它只是一個(gè)工具,在少許情況下轉(zhuǎn)換出來的代碼會(huì)出現(xiàn)編譯不過的情況,這時(shí)就需要你手動(dòng)修改代碼,解決語法問題。所以對(duì) Kotlin 語法不熟悉的同學(xué),不推薦進(jìn)行強(qiáng)轉(zhuǎn),也沒這個(gè)必要,因?yàn)?Kotlin 和 Java 完全可以互調(diào)。

為了講明 DataBinding 的用法,Demo 初期都是使用 Java 語言編寫的,這樣可以讓讀者專注于 DataBinding 本身,而不用擔(dān)心 Kotlin 語言的干擾。但本節(jié)就是講解 Kotlin 的用法,所以我在配套的 Demo 項(xiàng)目中創(chuàng)建了一個(gè) kotlin 分支,此篇的示例可以切換到 kotlin 分支查看。

DataBinding 在 Kotlin 中的配置

想在 Kotlin 項(xiàng)目中使用 DataBinding 你必須在 module 下的 build.gradle 中配置如下信息:

...
apply plugin: 'kotlin-kapt'
...
dependencies {
    ...
    kapt "androidx.databinding:databinding-compiler:3.3.1"
}

apply plugin: 'kotlin-kapt'是為項(xiàng)目添加 kapt 依賴,kapt 即 Kotlin annotation processing tool(Kotlin 注解處理工具)縮寫。在 Kotlin 中通過 kapt 編譯器插件支持注解處理器,比如在 Kotlin 項(xiàng)目中使用像 Dagger 或者 DataBinding 這樣大量使用了注解的庫(kù)。
kapt "androidx.databinding:databinding-compiler:3.3.1"是添加 DataBinding 的編譯插件,通過它可以識(shí)別 DataBinding 中的各種注解。

DataBinding 的編譯插件必須和 Android studio 版本對(duì)應(yīng),否則會(huì)編譯報(bào)錯(cuò),我這里是使用的 Android studio 3.3.1,所以 DataBinding 插件也是 3.3.1 版本。DataBinding 插件從 3.3.x 開始是 androidx 版本,在 3.3.x 之前是這樣寫:kapt "com.android.databinding:compiler:3.2.1"。

DataBinding 在 Kotlin 中的適配器

在使用 DataBinding 的過程中,我們會(huì)寫很多@BindingAdapter,這些適配器方法必須是靜態(tài)的,但在 Kotlin 當(dāng)中如何聲明靜態(tài)方法呢?使用@JvmStatic注解來解決這類問題,以下為 Java 和 Kotlin 的代碼對(duì)比:

    //java 代碼
    @BindingAdapter(value = {"app:image", "app:placeholder", "app:error"}, requireAll = false)
    public static void loadImage(ImageView view, String url, Drawable placeholder, Drawable error) {
        if (TextUtils.isEmpty(url)) {
            view.setImageDrawable(placeholder);
        } else {
            RequestOptions options = new RequestOptions().placeholder(placeholder).error(error);
            Glide.with(view).load(url).apply(options).into(view);
        }
    }
    //kotlin 代碼
    @BindingAdapter(value = ["app:image", "app:placeholder", "app:error"], requireAll = false)
    @JvmStatic
    fun loadImage(view: ImageView, url: String, placeholder: Drawable, error: Drawable) {
        if (TextUtils.isEmpty(url)) {
            view.setImageDrawable(placeholder)
        } else {
            val options = RequestOptions().placeholder(placeholder).error(error)
            Glide.with(view).load(url).apply(options).into(view)
        }
    }

靜態(tài)字段也是一樣需要加上@JvmStatic注解,否則編譯會(huì)提示找不到對(duì)應(yīng)字段。

object View {
    @JvmStatic
    var isShow = false
}

至此 Demo 已經(jīng)可以正常運(yùn)行了,DataBinding 的講解也將告一段落。在此期間因?yàn)楦鞣N緣由斷了3個(gè)月左右,但慶幸終于得空把設(shè)想的內(nèi)容基本寫完。如果你是全系列看完,至此應(yīng)該可以正常的使用 DataBinding 庫(kù)了,后續(xù)可能還會(huì)寫一些特別篇,內(nèi)容可能是 DataBinding 和 Architecture Components 聯(lián)合使用,或者是一些心得,以及使用規(guī)范等。

如果你覺得文章有幫助到你,記得點(diǎn)個(gè)喜歡以表支持,同時(shí)歡迎你的指正和建議。十分感謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容