Android現有工程使用Compose

Android現有工程使用Compose

看了Compose的示例工程後,我們也想使用Compose。基於目前情況,在現有工程基礎上添加Compose功能。

引入Compose

首先我們安裝 Android Studio Arctic Fox 或更高版本。

項目的配置gradle/wrapper/gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip

項目的gradle

buildscript {
    ext.kotlin_version = '1.5.21'

    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.0.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

使用7.0.3 Android Gradle 插件。kotlin版本1.5.31

模塊的gradle。最低API級別設置爲21或更高,啓用 Jetpack Compose。另外還要設置 Kotlin 編譯器插件的版本。

apply plugin: 'kotlin-android' // 沿用開頭的設置

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"
    
    defaultConfig {
        minSdkVersion 21
        // ...
    }
    buildFeatures {
        // 啓用 Jetpack Compose
        compose true
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    composeOptions {
        kotlinCompilerExtensionVersion '1.0.1'
    }
}

依賴

    // Integration with activities
    implementation 'androidx.activity:activity-compose:1.3.1'
    // Compose Material Design
    implementation 'androidx.compose.material:material:1.0.1'
    // Animations
    implementation 'androidx.compose.animation:animation:1.0.1'
    // Tooling support (Previews, etc.)
    implementation 'androidx.compose.ui:ui-tooling:1.0.1'
    // Integration with ViewModels
    implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha07'
    // UI Tests
    androidTestImplementation 'androidx.compose.ui:ui-test-junit4:1.0.1'

as的 Build. Execution, Deployment - Build Tools - Gradle - Gradle JDk 選擇as自帶的Jre11

使用Compose

新Activity

前面的gradle設置完畢,新建一個activity來試一下。

// ComposeGuideAct.kt
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview

class ComposeGuideAct : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            GuidePage()
        }
    }
}

@Composable
private fun GuidePage() {
    Column {
        Text(text = "Compose 示例", color = Color.Yellow)
        Text(text = "an.rustfisher.com", color = Color.Yellow)
        ShowHello(name = "小明")
        ShowHello(name = "小強")
    }
}

@Composable
private fun ShowHello(name: String) {
    Text(text = "Hi $name", color = Color.Cyan)
}

onCreate中使用setContent,傳入一個帶有@Composable註解的可組合函數GuidePage()
GuidePage()裏面又使用了ShowHelloColumnText。它們都是可組合函數。

對於GuidePage()ShowHello函數,需要注意:

  • 它們帶有@Composable註解。所有的可組合函數都必須帶有此註解。它能告訴Compose編譯器,把這數據轉換爲界面
  • 可組合函數可以接受一些參數,這些參數可進行邏輯處理。上面代碼裏,ShowHello(name: String)接受一個 name:String
  • 函數可以在界面中顯示文本。調用 Text() 可組合函數,該函數實際上會創建文本界面元素。可組合函數通過調用其他可組合函數來發出界面層次結構
  • 函數不會返回任何內容。發出界面的 Compose 函數不需要返回任何內容,因爲它們描述所需的屏幕狀態,而不是構造界面微件。

別忘了在manifest裏註冊這個activity。運行起來可以看到效果。
至此我們可以說現有項目已經引入了Compose。

添加預覽

可以給Compose添加預覽,使用註解@Preview

在上面的基礎上,添加預覽設置

@Preview("guide")
@Preview("guide - big",fontScale = 1.2f)
@Composable
fun PreviewPost() {
    GuidePage()
}

添加2個預覽,分別起名“guide”和“guide - big”。後者把字體調大一點。

PreviewPost()方法裏使用了我們之前定義的GuidePage()GuidePage()也是實際工作中的代碼。

需要預覽的方法,也需要添加@Composable註解

Android Studio 預覽效果

預覽界面也可以直接運行到手機上

小結

要在現有工程中引入Compose,需要對gradle進行設置。對老舊工程來說,變動比較大。甚至某些代碼也要跟着改。

可組合函數使用@Composable註解。可以用as直接預覽。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章