今後の保守性や開発の進め方を考え、画面(機能)ごとにモジュールを作成することにします。
今回は、下記のモジュール構成で進めていきます。
トップディレクトリで: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/src/main/kotlin内にライブラリモジュールのbuild.gradle.ktsで使用するビルドプラグインを作成します。
ファイル名をLibraryConfigurePlugin.ktにしています。
package jp.co.progress_llc.buildlogic
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
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.buildlogic.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")
id("org.jetbrains.kotlin.plugin.compose")
}
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, :