編輯:關於android開發
作者:Antonio Leiva
時間:Dec 27, 2016
原文鏈接:https://antonioleiva.com/custom-views-android-kotlin/
在我們閱讀有關class文章時,你可能記得通常情況下僅用一個構造函數。這對於要創建定制視圖就是一個問題。
Android框架希望有多個構造函數對應不同的創建視圖位置和創建視圖方法(通過代碼、使用XML,設置主題,等等),這樣我們就不能忽略這種情況。
為此,Kotlin團隊提供了同一個類中有多個構造函數的能力,就如同這裡所說的。
兼容Java是Kotlin的基礎要求,所以無論你遇到什麼情況,就應該想到必定有方法實現你的需要。
即使你已經有創建定制視圖的經驗和一些Kotlin知識,也可能第一次在Kotlin中創建定制視圖,你會發現有點復雜。
在Kotlin中實現幾個構造函數是最為復雜的工作之一,准確地說,這是比較罕見用法。
但是,不用擔心,一旦你接觸過一次,其余的都是非常相似的。
注:盡管本文能有效的幫助你理解如何使用在Kotlin類中用多個構造函數,但是,Kirill Rakhman在評論提及的方法是更好的方法。在結尾閱讀。
為了這樣,就如我們早前見到的那樣創建一個類。例如它繼承View,但不說明任何構造函數:
1 class KotlinView : View { 2 }
由於這段代碼邀請調用父類的構造函數,所以這段地面不能編譯。
例如,如果你僅僅是在Kotlin代碼中擴展你的視圖,你可能用我們已經見到的唯一的構造函數形式:
1 class KotlinView(context: Context?) : View(context) { 2 }
但是要小心,由於如果決定在這個視圖加XML,它將失敗。
說明:你見到在Context右邊的問號嗎?在Kotlin中,如果我們要變量或參數是null,我們就必須用問號明確地指明它。之後編譯器將要求我們在使用該變量前檢查它不能為null。在下一篇文章閱讀這點。
構造函數用保留字constructor,它可以是同類的另一個構造函數(用this)或一個父類(用super)。
這是你定義Android視圖的構造函數:
1 class KotlinView : View { 2 3 constructor(context: Context?) : this(context, null) 4 constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0) 5 6 constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { 7 ... 8 } 9 10 }
在評論中,Kirill提及(非常感謝!)另一種方法更簡單、更易閱讀。它是基於為構造函數的自變量分配默認值,但是需要一點點調整。
問題是在你用自變量默認值創建構造函數(或任何函數)時,在Kotlinzhong產生的字節碼僅僅允許用那些默認值。如果在Java中,你用構造函數,你可以強制說明所有自變量的值。
這是因為Java沒有這樣的語言特性。在Java中,你要依據你的需要通過產生函數重載解決它。
在Kotlin中,你可以用@JvmOverloads注釋得到自動產生的代碼。
代碼像這樣:
1 class KotlinView @JvmOverloads constructor( 2 context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 3 ) : View(context, attrs, defStyleAttr)
一旦你了解它,產生包含有多個構造函數的定制的視圖也不復雜了,用@JvmOverloads注釋則更容易。
這對於任何需要多個構造函數的類是都非常有用。但總的來說,如你能賦值參數的默認值(從而避免重載),通常就不需要多個構造函數。
如果你要了解更多這方面知識編寫實際的APP,我建議你閱讀我書《Android開發者的Kotlin》。
在Kotlin中創建定制視圖
Popwindow仿微信右上角菜單,popwindow仿菜單MenuPopwindow: 1 package com.cloudeye.android.cloud
Android 獲取系統的聯系人,android獲取聯系人本文主要介紹android中怎樣獲取系統的聯系人數據 首先打開模擬器 點擊聯系人圖標按鈕 說明系統聯系人數據
《Android源碼設計模式解析與實戰》讀書筆記(二十四) 第二十四章、橋接模式 橋接模式也稱為橋梁模式,是結構型設計模式之一。橋接模式中體現了“單一職責原
Android導入外部數據庫 當我們軟件中要使用大量數據,我們會選擇將這些數據存儲到一個數據庫中,然後通過數據庫的查詢修改操作來管理這些數據。大多數情況下我們都只在程序中