機能画面をFragmentとして作成し、Fragmentごとにモジュール分割を行います。
Fragmentのモジュールを作成します。
管理上の観点から、プロジェクトの直下にuiフォルダを作成して、その下にモジュールを配置します。
なお、新規モジュールはプロジェクトの直下にしか作成できないため、作成後にuiフォルダに移動します。
Fragmentモジュールの作成プロジェクト直下に新規モジュールを作成します。
モジュール情報の入力画面はFragmentになるので、テンプレートはAndroid Libraryを選択します。
Module nameは『home』にしています。
Package nameはuiディレクトリ内に移動させますので、末尾を『ui.home』にします。
『完了(F)』でモジュールが作成されます。
モジュールの移動作成したhomeモジュールを『リファクタリング(R)』で『ディレクトリの移動…』させます。
移動先の入力宛先ディレクトリに移動先の『ui』ディレクトリを入力します。
『リファクタリング(R)』でモジュールが移動されます。
プロジェクト直下のsettings.gradle.ktsを編集して、プロジェクトパスを移動します。
: include(":ui:home")
変更後、『Sync Now』で内容をプロジェクトに反映させます。
/ui/homeモジュールにFragmentを追加します。
Fragmentの作成/ui/homeモジュールの最上位で右クリック➡『新規(N)』➡『Fragment』➡『Fragment (with ViewModel)』で空のFragmentとViewModelを作成します。
Fragmentの情報Fragment NameをHomeFragmentにしています。
『完了(F)』でFragmentとViewModelが作成されます。
FragmentとViewModelの作成後、Activityと同様にjavaディレクトリをkotlinディレクトリに変更します。
※変更しなくても問題ありません。
依存ライブラリやプラグイン情報が自動的にバージョンカタログファイルに追記されていますので、内容を確認して必要に応じて修正します。
[versions] : legacy-support-v4 = "1.0.0" lifecycle-livedata-ktx = "2.6.1" lifecycle-viewmodel-ktx = "2.6.1" androidx-legacy-support = "1.0.0" androidx-lifecycle-ktx = "2.7.0" [libraries] : androidx-legacy-support = { module = "androidx.legacy:legacy-support-v4", version.ref = "androidx-legacy-support" } lifecycle-livedata-ktx = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "androidx-lifecycle-ktx" } lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "androidx-lifecycle-ktx" } [plugins] : androidLibrary = { id = "com.android.library", version.ref = "android-application" } android-library = { id = "com.android.library", version.ref = "android-application" } : [bundles] androidx-lifecycle-ktx = [ "lifecycle-livedata-ktx", "lifecycle-viewmodel-ktx" ]
最上位のbuild.gradle.ktsにライブラリプラグイン情報が追記されているので必要に応じて修正します。
plugins { : alias(libs.plugins.androidLibrary) apply false alias(libs.plugins.android.library) apply false }
Fragmentモジュール用のBuild Logicを作成します。
/build-logic/src/main/kotlin内にライブラリモジュールのbuild.gradle.ktsで使用するビルドプラグインを作成します。
ファイル名をFragmentConfigurePlugin.ktにしています。
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 FragmentConfigurePlugin: 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") apply("com.google.dagger.hilt.android") } 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", catalog.findLibrary("androidx.core.ktx").get()) add("implementation", catalog.findLibrary("androidx.appcompat").get()) add("implementation", catalog.findLibrary("google.android.material").get()) add("implementation", catalog.findLibrary("androidx.legacy.support").get()) add("implementation", catalog.findBundle("androidx.lifecycle.ktx").get()) add("implementation", catalog.findLibrary("hilt.android").get()) add("testImplementation", catalog.findLibrary("junit").get()) add("androidTestImplementation", catalog.findLibrary("androidx.test.ext.junit").get()) add("androidTestImplementation", catalog.findLibrary("androidx.test.espresso.core").get()) add("ksp", catalog.findLibrary("hilt.compiler").get()) } } } }
作成したビルドプラグインをライブラリモジュールのbuild.gradle.ktsで使用できるようにbuild-logic直下のbuild.gradle.ktsに追記します。
: gradlePlugin { : plugins { register("FragmentConfigurePlugin") { id = "build.logic.fragment.configure" implementationClass = "FragmentConfigurePlugin" } } }
/ui/homeモジュールのbuild.gradle.ktsをComposite Buildへ対応させます。
plugins { alias(libs.plugins.androidLibrary) alias(libs.plugins.kotlin.android) id("build.logic.fragment.configure") } android { namespace = "jp.co.example.android01.ui.home" compileSdk = 34 defaultConfig { minSdk = 27 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_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } } dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) implementation(libs.google.android.material) implementation(libs.androidx.legacy.support.v4) implementation(libs.lifecycle.livedata.ktx) implementation(libs.lifecycle.viewmodel.ktx) testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) androidTestImplementation(libs.androidx.test.espresso.core) }
対応後、『Sync Now』で内容をプロジェクトに反映させます。
FragmentにHiltへの対応を行います。
: import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class HomeFragment : Fragment() { :
ViewModelにHiltへの対応を行います。
: import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel class HomeViewModel @Inject constructor(): ViewModel() { :
appモジュールから作成したFragmentモジュールを参照できるようにします。
: dependencies { : implementation(project(":ui:home")) }
参照設定後、『Sync Now』で内容をプロジェクトに反映させます。
他のFragmentモジュールも同様に作成します。
※モジュール作成済のディレクトリへは直接モジュールを新規作成できます。
※『Composite Buildへの対応』は各Fragmentモジュールのbuild.gradle.ktsへの対応のみになります。
モジュール名を『:ui:settings』として作成できます。
今回は、settingsとlistingの2つのFragmentモジュールを追加しました。