用Kotlin實現Android定製視圖(KAD 06)

来源:http://www.cnblogs.com/figozhg/archive/2017/01/04/6250185.html
-Advertisement-
Play Games

作者:Antonio Leiva 時間:Dec 27, 2016 原文鏈接:https://antonioleiva.com/custom-views-android-kotlin/ 在我們閱讀有關class文章時,你可能記得通常情況下僅用一個構造函數。這對於要創建定製視圖就是一個問題。 Andro ...


作者:Antonio Leiva

時間:Dec 27, 2016

原文鏈接:https://antonioleiva.com/custom-views-android-kotlin/

 

 

在我們閱讀有關class文章時,你可能記得通常情況下僅用一個構造函數。這對於要創建定製視圖就是一個問題。

 

Android框架希望有多個構造函數對應不同的創建視圖位置和創建視圖方法(通過代碼、使用XML,設置主題,等等),這樣我們就不能忽略這種情況。

 

為此,Kotlin團隊提供了同一個類中有多個構造函數的能力,就如同這裡所說的。

 

相容Java是Kotlin的基礎要求,所以無論你遇到什麼情況,就應該想到必定有方法實現你的需要。

 

在Kotlin中創建定製視圖

 

即使你已經有創建定製視圖的經驗和一些Kotlin知識,也可能第一次在Kotlin中創建定製視圖,你會發現有點複雜。

 

 

Kotlin中實現幾個構造函數是最為複雜的工作之一,準確地說,這是比較罕見用法。

 

 

但是,不用擔心,一旦你接觸過一次,其餘的都是非常相似的。

 

 

註:儘管本文能有效的幫助你理解如何使用在Kotlin類中用多個構造函數,但是,Kirill Rakhman在評論提及的方法是更好的方法。在結尾閱讀。

 

創建繼承View的類

 

 

為了這樣,就如我們早前見到的那樣創建一個類。例如它繼承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中創建定製視圖


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Javascript 2016年12月19日整理 JS基礎 Chapter1 1. JS是一門運行在瀏覽器客戶端的腳本編程語言,前臺語言 1. 組成部分 1. ECMAscript JS標準 2. DOM 通過JS操作網頁元素 3. BOM 通過調用API操作瀏覽器 2. 特點: 封裝,繼承,多態 ...
  • 什麼是應用程式緩存(Application Cache)? HTML5 引入了應用程式緩存,這意味著 web 應用可進行緩存,並可在沒有網際網路連接時進行訪問。 應用程式緩存為應用帶來三個優勢: 離線瀏覽 - 用戶可在應用離線時使用它們 速度 - 已緩存資源載入得更快 減少伺服器負載 - 瀏覽器將只從 ...
  • CSS學習筆記 2016年12月15日整理 CSS基礎 Chapter1 在console輸入escape("宋體") ENTER 就會出現unicode編碼 顯示"%u5B8B%u4F53" 就是\5B8B\4F53 font family: 中文,英文,最好的是unicode編碼 eg. fon ...
  • HTML學習筆記 2016年12月15日整理 Chapter1 1. 1. scheme: 定義網際網路服務的類型,常見的為http 2. host: 定義域主機(http的預設主機是www) 3. domain: 定義網際網路功能變數名稱 4. port: 定義埠號,預設是埠80 5. path: 網頁在 ...
  • attribute 是原生js dom 對象上的一個屬性,這個屬性有很多子屬性,比如 isId(判斷屬性是否是Id) , name (獲取屬性名稱) , value (獲取屬性值),attributes 用來獲取dom元素 的所有屬性集合。 話不多說,上例子了: attrs 中就包含 input 所 ...
  • 文本超出部分隱藏,總結兩種方法。 1、單行隱藏 html代碼 css代碼 結果 當文字超過範圍的時候,超出部分會隱藏起來。 2、多行隱藏 css代碼 結果 當文字超過範圍的時候,超出部分會隱藏起來。可以設置第幾行開始隱藏。 ...
  • 看下效果先 下麵有完整的示例代碼 使用BitmapShader(著色器) 我們在繪製view 的時候 就是小學上美術課 用水彩筆在本子上畫畫 使用著色器繪製圓形圖片最簡單的理解方式 就是把bitmap當做一種顏色 設置給paint ,paint都已經有顏色了 你想讓它方了,圓了,扁了 還不是看你心情 ...
  • 這幾天自己研究了關於地手機上面開發安卓地圖的問題,發現百度官方示例demo講解百度持續定位方面還是講解的有些不清楚,本人研究了幾次之後將其弄得更詳細以便於讓各位方便學習,有不足之處請在評論區指出,官方示例的網址是:http://lbsyun.baidu.com/index.php?title=and ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...