今後の保守性や開発の進め方を考え、画面(機能)ごとにモジュールを作成することにします。
今回は、下記のモジュール構成で進めていきます。
トップディレクトリで:core:uiモジュールを作成します。
モジュールの作成プロジェクト直下で新規モジュールを作成します。
uiモジュール情報の入力画面(Activity)は不要なのでAndroid Libraryを選択します。
Module nameは『:core:ui』にしています。
Package nameは『jp.co.progress_llc.portal.core.ui』にします。
『完了(F)』でモジュールがcore/uiに作成されます。
:appモジュールと同様に/core/ui/src/main/java/… のディレクトリ名を /core/ui/src/main/kotlin/… に変更します。
※変更しなくても構いません。
/core/ui/src/androidTest/java、/core/ui/src/test/java も同様にkotlinに変更します。
サンプルテストクラスは、残しておくと依存の関係でコンパイルエラーが出ることがありますので削除します。
下記のファイルを削除します。
:build-logicのplugins内にライブラリモジュールのbuild.gradle.ktsで使用するビルドプラグインLibraryConfigurePlugin.ktを作成します。
package jp.co.progress_llc.portal.buildlogic.plugins import com.android.build.api.dsl.LibraryExtension import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies import jp.co.progress_llc.portal.buildlogic.core.libs import jp.co.progress_llc.portal.buildlogic.core.configureCommonExtension class LibraryConfigurePlugin: Plugin<Project> { override fun apply(project: Project) = with(project) { with(pluginManager) { apply("com.android.library") apply("org.jetbrains.kotlin.android") apply("com.google.devtools.ksp") } extensions.configure<LibraryExtension> { configureCommonExtension(this) defaultConfig.consumerProguardFiles("consumer-rules.pro") buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } } dependencies { add("implementation", project.libs().findLibrary("androidx-core-ktx").get()) add("implementation", project.libs().findLibrary("androidx-appcompat").get()) add("implementation", project.libs().findLibrary("material").get()) } } }
作成したビルドプラグインをモジュールのbuild.gradle.ktsで使用できるようにbuild-logic直下のbuild.gradle.ktsに追記します。
: gradlePlugin { : plugins { register("LibraryConfigurePlugin") { id = "build.logic.library.configure" implementationClass = "jp.co.progress_llc.portal.buildlogic.plugins.LibraryConfigurePlugin" } } } dependencies { :
追記後、『Sync Now』で内容をプロジェクトに反映させます。
:core:uiモジュールのbuild.gradle.ktsに作成したビルドプラグインを適用します。
plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin.android) id("build.logic.library.configure") alias(libs.plugins.compose.compiler) } android { namespace = "jp.co.progress_llc.portal.core.ui" compileSdk { version = release(36) } defaultConfig { minSdk = 28 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") } buildTypes { release { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = "11" } buildFeatures { compose = true } } dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) implementation(libs.material) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) implementation(platform(libs.compose.bom)) implementation(libs.compose.ui) implementation(libs.compose.material) }
適用後、『Sync Now』で内容をプロジェクトに反映させます。
:core:uiモジュールを作成しましたので、:appモジュールのui定義を:core:uiモジュールに移動させます。
リファクタリング/app/scr/main/…/ui直下のthemeディレクトリを右クリック➡『リファクタリング(R)』➡『パッケージまたはディレクトリの移動…』でディレクトリの移動を行います。
ディレクトリの移動『宛先ディレクトリ(D)』をクリックします。
移動『宛先ディレクトリ』に:core:uiモジュールのsrc/main/…/core/uiを指定します。
『リファクタリング(R)』でディレクトリを移動します。
移動後、/app/scr/main/…/uiディレクトリ内が空になっているので、uiディレクトリを削除します。
:appモジュールに:core:uiモジュールへの依存を追記します。
: dependencies { implementation(project(":core:ui")) :
追記後、『Sync Now』で内容をプロジェクトに反映させます。
:appモジュールのMainActivity.ktに:appモジュールのuiを参照している定義がありますので:core:uiモジュールを参照するように変更します。
: import jp.co.progress_llc.portal.ui.theme.PortalTheme import jp.co.progress_llc.portal.core.ui.theme.PortalTheme :
この時点で、一度エミュレーターで実行してみます。
『Hello Android!』がエミュレーターの端末に表示されれば問題ありません。
デフォルトのui/themeではなく、Google公式ツールのマテリアルテーマビルダーでカスタムテーマを作成して適用することもできます。
ソースカラーの変更マテリアルテーマビルダーの『Source Color』の色の箇所をクリックします。
※右側の『Random Color』のアイコンをクリックしてランダムに変わる配色を画面上で確認しながら選択することもできます。
Color Picker『Hex Color』等で色を指定します。
例では、Light Cyan (0xE0FFFF)を指定しています。
『Apply』等で色を適用します。
ファイルの保存マテリアルテーマビルダーの右上のアイコンをクリックします。
ファイル名の指定上部のペンアイコンで保存するファイル名を指定することができます。
『Export』をクリックします。
ファイル形式の指定『Jetpack Compose (Theme.kt)』を選択します。
指定したファイル名のzipファイルがダウンロードされます。
:core:uiモジュールのscr/main/…/ui/theme内のファイルをダウンロードしたzipファイルの\ui\theme内のファイルに置き換えます。
各ファイルのpackage行を:core:uiモジュールのthemeに変更します。
下記はColor.ktの例です。
同様にTheme.kt、Type.ktも変更します。
: package com.example.compose package jp.co.progress_llc.portal.core.ui.theme :
:appモジュールのMainActivity.ktにあるPortalThemeのimport定義をAppThemeに変更します。
: import jp.co.progress_llc.portal.core.ui.theme.PortalTheme import jp.co.progress_llc.portal.core.ui.theme.AppTheme : setContent { PortalTheme { AppTheme { : fun GreetingPreview() { PortalTheme { AppTheme { :
カスタムテーマを適用させるため、dynamicColorを使用しないようにします。
※dynamicColorはデバイス設定や壁紙の色に基づいてアプリの配色を動的に変化させる仕組みです。
デバイス設定や壁紙の色に基づいて配色を動的に変化させるため、カスタムテーマの設定は無視されます。
:core:uiモジュールのTheme.ktの定義を変更します。
: fun AppTheme( : dynamicColor: Boolean = true, dynamicColor: Boolean = false, :
エミュレーターを実行して、背景色がカスタムテーマの背景色になっていれば問題ありません。