使用Kotlin開發Android應用(IV):自訂視圖和Android擴充

來源:互聯網
上載者:User

標籤:android   kotlin   android-studio   

使用Kotlin開發Android應用(IV):自訂視圖和Android擴充

@author ASCE1885的 Github 簡書 微博 CSDN
原文連結

在讀完擴充函數和預設值這篇文章之後,那麼接下來要介紹什麼呢?在本系列第一篇文章中我們說過,Kotlin使得Android開發更加簡單,本文我們將進一步作介紹。

自訂視圖

你應該還記得,在說到Kotlin的局限性時,我們提到了在Kotlin早期版本(M10之前)是不支援自訂視圖的,因為當時只能為每個類建立一個建構函式。這通常是足夠的,因為使用選擇性參數,我們可以建立足夠多的建構函式變種,例如:

class MyClass(param: Int, optParam1: String = "", optParam2: Int = 1) {??    init {?        // Initialization code?    }?}

通過這一個建構函式,我們有如下四種方式建立這個類:

val myClass1 = MyClass(1)val myClass2 = MyClass(1, "hello")val myClass3 = MyClass(param = 1, optParam2 = 4)val myClass4 = MyClass(1, "hello", 4)

正如你所見,使用選擇性參數我們得到了一堆的組合。但是通過繼承普通Views的方式來建立自訂Views時,我們可能會遇到問題。自訂Views需要重寫一個或者多個建構函式以便正常工作,但我們做不到這一點。幸運的是,自動Kotlin M11開始,我們可以聲明多個建構函式,類似Java。下面是一個正方形的ImageView:

class SquareImageView : ImageView {    public constructor(context: Context) : super(context) {    }    public constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {    }    public constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {    }    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec)        val width = getMeasuredWidth()        setMeasuredDimension(width, width)    }}

通過很簡單的代碼我們實現了自訂Views。

Kotlin Android擴充

從Kotlin M11開始增加的擴充外掛程式使得Android開發人員更容易取得XML檔案中定義的Views。你可能會覺得它很像ButterKnife,但使用起來更簡單。

Kotlin Android擴充本質上是一個視圖綁定,使得開發人員在代碼中通過id就可以使用XML檔案中定義的Views。它將自動為Views建立屬性值,而不用使用第三方註解架構或者findViewById函數。

要使用這個特性,首先需要安裝外掛程式“Kotlin Android Extension”,並在build.gradle檔案的構建指令碼依賴中增加一個新的classpath:

buildscript {?    …?    dependencies {        …?        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"    }?}

假如你定義了名為main.xml的布局檔案:

<FrameLayout?    xmlns:android="..."?    android:id="@+id/frameLayout"?    android:orientation="vertical"?    android:layout_width="match_parent"?    android:layout_height="match_parent">??    <TextView?        android:id="@+id/welcomeText"?        android:layout_width="wrap_content"?        android:layout_height="wrap_content"/>??</FrameLayout>

如果想在Activity中使用這個檔案裡面定義的Views,你只需要匯入這個xml檔案的synthetic屬性值,如下所示:

import kotlinx.android.synthetic.<xml_name>.*

具體到我們的例子,則如下所示:

import kotlinx.android.synthetic.main.*

這樣你就可以使用id來取得這些views的引用了:

override fun onCreate(savedInstanceState: Bundle?) {?    super<BaseActivity>.onCreate(savedInstanceState)    setContentView(R.id.main)?    frameLayout.setVisibility(View.VISIBLE)?    welcomeText.setText("I′m a welcome text!!")?}
總結

這兩個新特性的引入,讓我們看到了Kotlin團隊致力於讓Android開發更簡單。他們也發布了一個名為Anko的函數庫,這個一門從Kotlin檔案建立Android布局的領特定領域語言(DSL)。我還沒有使用過它的主要功能,但當處理Android視圖時,你可以使用它來簡化代碼。在我上傳到Github上的開源項目Bandhook-Kotlin也有相關的例子。

下一篇文章將介紹lambda運算式的使用,以及它如何簡化代碼和擴充語言的特性。非常有趣的一個特性,在我看來,這是Kotlin相比Java 1.7最強大的方面。

文末攝影鑒賞

使用Kotlin開發Android應用(IV):自訂視圖和Android擴充

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.