Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Kotlin的擴展函數:擴展Android框架(KAD 08),kotlinandroid

Kotlin的擴展函數:擴展Android框架(KAD 08),kotlinandroid

編輯:關於android開發

Kotlin的擴展函數:擴展Android框架(KAD 08),kotlinandroid


作者:Antonio Leiva

時間:Jan 11, 2017

原文鏈接:https://antonioleiva.com/extension-functions-kotlin/

 

 

擴展函數是Kotlin提供的非常酷的特性,在編寫Android應用程序時,你將發現自己會大量使用它。

 

我們必須承認Android框架有時做些事有點困難,在Java中我們唯一的解決方案是把我們要做事封裝起來,或利用可讀性差的類靜態方法。

 

你想怎樣才能加額外函數到框架類?這就是Kotlin擴展函數允許我們做的。

 

Kotlin擴展函數

 

如其名稱所隱含的,擴展函數是一種函數,它幫助我們擴展類功能,而無需涉及它們的代碼。現在讓我們來看怎樣定義這些函數,以及一些我個人認為非常有用的例子。

 

怎樣定義擴展函數?

 

就如同你平常編寫函數那樣,在分隔點之前放置類名稱。這些函數可以放在任何位置上,不過通常在一個擴展(Extensions)文件,這個擴展文件甚至不需要包含一個類。

 

一個非常簡單的例子,我們要視圖有visible(),使它可見。我們這樣編寫:

1 fun View.visible() {
2     this.visibility = View.VISIBLE
3 }

 

如你所見,使用該類的功能和屬性時,我加上this保留字,就像我們是在類內部,但是你也可以省略:

1 fun View.visible() {
2     visibility = View.VISIBLE
3 }

 

一些有趣的例子

 

我來說明兩三個我喜歡的例子,它們很好的展示了擴展函數的能力。

 

第一個有用的例子是你在擴展(inflate)視圖內的適配器。通常你這樣用:

1 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
2     val v = LayoutInflater.from(parent.context).inflate(R.layout.view_item, parent, false)
3     return ViewHolder(v)
4 }

 

在擴展(inflate)視圖的代碼行中使用了parent,太復雜了,並且99%時間裡通常與任何其它適配器相同。為什麼不給ViewGroups擴展視圖的能力?

1 fun ViewGroup.inflate(layoutRes: Int): View {
2     return LayoutInflater.from(context).inflate(layoutRes, this, false)
3 }

 

現在你可以在上面的代碼使用它:

1 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
2     val v = parent.inflate(R.layout.view_item)
3     return ViewHolder(v)
4 }

 

一個使用圖像的非常類似例子也可以這樣做。例如,如果你使用Picasso庫,你需要典型的構建器加載圖像:

1 Picasso.with(imageView.context).load(url).into(imageView)

 

你想要如何能夠告知ImageView自己加載URL嗎?

1 fun ImageView.loadUrl(url: String) {
2     Picasso.with(context).load(url).into(this)
3 }
4  
5 imageView.loadUrl(url)

 

擴展屬性

 

就像你能夠擴展函數一樣,同理也能處理屬性。你需要記住的就一件事,擴展屬性不能保存狀態,而且需要用已有函數請求或更改對象的狀態:

1 val ViewGroup.children: List
2     get() = (0..childCount -1).map { getChildAt(it) }

 

這個屬性由ViewGroup的children中取出。

 

現在你就可以直接替代他們:

1 parent.children.forEach { it.visible() }

 

注意

it是一個保留字,當函數僅有一個輸入值時,用於訪問函數的輸入值。如我們在其他文章所讀到,你可以命名那些輸入值,當有多個輸入值時,在Lambda表達式左邊寫上par。

 

結論

利用擴展函數和擴展屬性,你可以擴展任何類(即使你沒有訪問其代碼),而且如同它們是類的一部分一樣使用那些擴展函數和屬性。你將看到的唯一的事就是使用導入一個額外的文件。

 

如果你喜歡Kotlin,要進一步的學習,建議閱讀《Android開發者的Kotlin》一書,在書中我介紹這點和你在Android應用程序開發期間的許多事情。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved