「Android Studio Giraffe」の作成するプロジェクトは、Jetpack Composeの利用が推奨されます。
今後、Viewシステムに代わり、Jetpack Composeが主流になるようです。
※環境:Android Studio Giraffe | 2022.3.1 Patch 1
Kotlin 1.8.10
Compose Compiler 1.4.3
目次
プロジェクトの作成
「Android Studio Giraffe」は、プロジェクトの新規作成(File ⇒ New ⇒ New Project…)を行うと、Jetpack ComposeとViewシステムのテンプレートが選択できます。
ただし、選択パネルは、Jetpack Composeのテンプレートがハイライトされて立ち上がります。ですので、Jetpack Composeの利用が優先されているようです。
以下は、テンプレート「Empty Activity」を指定して作成したプロジェクトです。
テンプレートはJetpack Composeの必要最低限の構文が詰め込まれたサンプルアプリです。これだけで、ビルドが通り、実行が可能です。
Jetpack Composeとは
Jetpack ComposeはAndroidシステムの新たなUIフレームワークです。従来のViewシステムと、アプリ画面の描画の仕組みが異なります。
詳細は次の2つの記事を参照してください。
「Jetpack Compose:Composeによるアプリ画面の描画」
「Jetpack Compose:再Composeとスキップ」
開発環境(またはプロジェクト)から見たJetpack Composeの違いは、アプリ画面の構成をKotlinでプログラミングすることです。
画面の構成を記述したKotlinのソースコードはCompose Compilerにより描画処理を行うバイトコードへ変換されます。
Compose CompilerはKotlin Compilerを拡張したJetpack Compose向けの特別なコンパイラーです。
ファイル構成
図はJetpack Composeプロジェクトのファイル構成です。
レイアウトリソース(res/layout)は存在しません。画面の構成はKotlinのソースファイル(XXX.kt)へ記述されます。
MainActivityファイル
MainActivityファイルの記述は3つの部分に分けられます。
- (1)画面の構成(Composable 関数のUIツリー)
- (2)Activity(ライフサイクル)
- (3)画面のプレビュー
画面の構成(Composable 関数のUIツリー)
@Composableアノテーションが付いた関数がComposable関数です。一つのUI要素を表現しています。
そして、Composable関数から子Composable関数を呼び出すことで、階層(UIツリー)を作り、アプリ画面を構成します。
例えば、プロジェクト作成時のサンプルアプリは、5階層のUIツリーになっています。
※図はAndroid StudioのLayout Inspectorの表示です。
Activity(ライフサイクル)
ライフサイクルに従って、Activityの動作を記述する部分です。
MainActivityはComponentActivityを継承しています。
そのComponentActivityの拡張関数setConponentが、UIツリーをViewツリーへ組み込む作業を行っています。
public fun ComponentActivity.setContent( parent: CompositionContext? = null, content: @Composable () -> Unit ) { val existingComposeView = window.decorView .findViewById<ViewGroup>(android.R.id.content) .getChildAt(0) as? ComposeView if (existingComposeView != null) with(existingComposeView) { setParentCompositionContext(parent) setContent(content) } else ComposeView(this).apply { // Set content and parent **before** setContentView // to have ComposeView create the composition on attach setParentCompositionContext(parent) setContent(content) // Set the view tree owners before setting the content view so that the inflation process // and attach listeners will see them already present setOwners() setContentView(this, DefaultActivityContentLayoutParams) } }
UIツリーとViewツリーの間に、仲介役のComposeViewが入ります。
画面のプレビュー
@Previewアノテーションの付いたComposable関数はプレビュー対象になります。
プレビュー対象の関数は引数を持ていないので注意してください。
@Preview(showBackground = true) @Composable fun GreetingPreview() { MyApplicationTheme { Greeting("Android") } }
プレビュー対象の関数は、Android Studioによりデザインの状態が表示されます。ただし、表示にはビルドが必要です。
また、複数のプレビューを同時に行うことができます。
あまり多くのプレビューを行うと、ビルドに時間がかかり、Android Studioの軽快な操作感が損なわれます。多用はお勧めしません。
ビルド環境の設定(build.gradle)
Compose Compilerとツールキットの指定が確認できます。
... android { namespace = "com.example.res.project" compileSdk = 34 ... kotlinOptions { jvmTarget = "1.8" } buildFeatures { compose = true // Composerの処理を有効化 } composeOptions { kotlinCompilerExtensionVersion = "1.4.3" // 使用するCompose Compiler } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } } dependencies { implementation("androidx.core:core-ktx:1.9.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2") implementation("androidx.activity:activity-compose:1.8.0") implementation(platform("androidx.compose:compose-bom:2023.03.00")) implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.material3:material3") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) androidTestImplementation("androidx.compose.ui:ui-test-junit4") debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-test-manifest") }
なお、Compose CompilerはKotlin Compilerと互換性のあるバージョンを選ぶ必要があります。詳細は「ComposeとKotlinコンパイラーの互換性とビルドエラー」を参照。
関連記事: