close

由於老闆想讓不會程式的同事們在開會時溝通順利一點

所以就寫了這篇較詳細易懂的文

希望行銷、PM 們可以理解 XDD

 

最近 Google 已宣佈棄用 Kotlin Android Extensions

需要改用 Jetpack view binding

為什麼呢?

 

是因為 Kotlin Android Extensions 在運行上

對於 view 的管理並不是很好,導致會有偶發性的 nullPointException

而 view binding 則可以配合 Activity 、Fragment 的 lifecycle 來進行管理

降低了 nullPointException 的發生率

 

演進過程!!!

在看 code 之前,我們先介紹一下 Android 對於 view 的演進過程

從一開始的 findViewById

val tv = findViewById<TextView>(R.id.mainAccIssueContent)
tv.text = "test"
tv.setTextColor(Color.RED)

因為太繁鎖了,每個 view 都要寫一次去找

所以後來 Jake Wharton 大神寫了一個 Library

Butterknife 點擊進入 Github 

Logo

這是一個很受歡迎的 library 

直至後來 Kotlin 的興起

Kotlin Android Extensions 的出現才漸漸的沒人在使用

最後作者也宣佈不再維護

建議大家用 Google 推薦的方式

 

Kotlin Android Extensions 為什麼會被這麼多人愛戴呢?

就是他方便、簡潔的使用方式

他用起來像這樣

itemChatListName.text = member.simpleInfo.name

直接 id 拿起來用,是不是很方便呢?

但現在也因為一些缺點,而需要改用 Google 自己的 Jetpack view binding

 

進入重點!!!

view binding 的使用,在 Module build.gradle 加入 

buildFeatures {
    viewBinding true
}

就可以開啟了

若是遷移的朋友們,要記得移除

apply plugin: `kotlin-android-extensions`

 

然後就要開始變更 code 了

一進來會看到紅通通的錯誤

截圖 2021-04-13 下午12.02.03

不用怕,這是移除 Kotlin Android Extensions 的關係

一步步慢慢修正就可以了

 

剛剛有提到 view binding 能做 lifecycle 的連動

我們首先增加一個 parameter

private var binding: FragmentCardBinding? = null

然後

override fun onDestroyView() {
    binding = null
    super.onDestroyView()
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    binding = FragmentCardBinding.bind(view)
}

在 onViewCreated 的時候,用 View 來 Binding

在 onDestroyView 的時候,釋放掉

所以在使用的時候我們就會先判斷

是不是 null , 如下

binding?.itemChatListName?.text = member.simpleInfo.name

至此,view binding 就算完成了

 

下篇會講我遇到的問題:

如何在 RecyclerView 裡面使用 view binding,點我進入

 

資料來源:
https://developer.android.com/topic/libraries/view-binding/migration
https://github.com/JakeWharton/butterknife
https://developer.android.com/topic/libraries/view-binding


arrow
arrow

    顏澤偉 發表在 痞客邦 留言(0) 人氣()