ユーザ用ツール

サイト用ツール


サイドバー

プログレス合同会社

広告

android:studio:application:fragment

02.Fragmentの作成

機能画面をFragmentとして作成し、Fragmentごとにモジュール分割を行います。

モジュールの作成

Fragmentのモジュールを作成します。

管理上の観点から、プロジェクトの直下にuiフォルダを作成して、その下にモジュールを配置します。

なお、新規モジュールはプロジェクトの直下にしか作成できないため、作成後にuiフォルダに移動します。

android:studio:application:android-app2101.png

Fragmentモジュールの作成

プロジェクト直下に新規モジュールを作成します。

android:studio:application:android-app2102.png

モジュール情報の入力

画面はFragmentになるので、テンプレートはAndroid Libraryを選択します。

Module nameは『home』にしています。

Package nameuiディレクトリ内に移動させますので、末尾を『ui.home』にします。

完了(F)』でモジュールが作成されます。

android:studio:application:android-app2103.png

モジュールの移動

作成したhomeモジュールを『リファクタリング(R)』で『ディレクトリの移動…』させます。

android:studio:application:android-app2104.png

移動先の入力

宛先ディレクトリに移動先の『ui』ディレクトリを入力します。

リファクタリング(R)』でモジュールが移動されます。

プロジェクト直下のsettings.gradle.ktsを編集して、プロジェクトパスを移動します。

   :
include(":ui:home")

2行目
“:home”を“:ui:home”に変更します。

変更後、『Sync Now』で内容をプロジェクトに反映させます。

Fragmentの追加

/ui/homeモジュールにFragmentを追加します。

android:studio:application:android-app2111.png

Fragmentの作成

/ui/homeモジュールの最上位で右クリック➡『新規(N)』➡『Fragment』➡『Fragment (with ViewModel)』で空のFragmentとViewModelを作成します。

android:studio:application:android-app2112.png

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" ]

3行目~5行目
修正前の内容です。
6行目~7行目に修正しました。
androidx-lifecycle-ktxのバージョンは最新安定バージョンに変更しています。
11行目~13行目
module表記に変更するとともに、名前、参照先バージョンを変更しました。
17行目
修正前の内容です。
18行目に修正しました。
22行目
androidx.lifecycle-ktxのlibraries定義をグループ化しています。

最上位のbuild.gradle.ktsにライブラリプラグイン情報が追記されているので必要に応じて修正します。

plugins {
   :
  alias(libs.plugins.androidLibrary) apply false
  alias(libs.plugins.android.library) apply false
}

3行目
修正前の内容です。
4行目に修正しました。

Composite Buildへの対応

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())
      }
    }
  }
}

11行目~14行目(pluginManager)
ライブラリモジュールで使用するプラグインを定義しています。
17行目
ConfigureExtension.ktで作成した全モジュールの共通定義を呼び出しています。
18行目~26行目
/features/home/build.gradle.kts内のandroidブロックを参照して指定します。
29行目~33行目、35行目~37行目
/features/home/build.gradle.kts内のdependenciesブロックの依存ライブラリを定義しています。
androidx.lifecycleはグループ化した定義を参照しています。
バージョンカタログを参照しています。
34行目、38行目
Hiltの依存ライブラリをバージョンカタログを参照して定義しています。

作成したビルドプラグインをライブラリモジュールのbuild.gradle.ktsで使用できるようにbuild-logic直下のbuild.gradle.ktsに追記します。

   :
gradlePlugin {
   :
  plugins {
    register("FragmentConfigurePlugin") {
      id = "build.logic.fragment.configure"
      implementationClass = "FragmentConfigurePlugin"
    }
  }
}

5行目
任意の名前で名称を定義しています。
6行目
任意の名前でプラグインのidを定義しています。
7行目
プラグインを実装しているクラスを指定します。
/build-logic/src/main/kotlin内に作成したFragmentConfigurePlugin.ktで定義しているクラス名です。

/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)
}

2行目~3行目、9行目~30行目、35行目~43行目
ビルドプラグインで定義しているので削除します。
4行目
/build-logic/build.gradle.ktsで定義したライブラリモジュール用ビルドプラグインのidを指定します。

対応後、『Sync Now』で内容をプロジェクトに反映させます。

Hiltへの対応

FragmentにHiltへの対応を行います。

   :
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class HomeFragment : Fragment() {
   :

4行目
Fragmentのclass宣言の前に@AndroidEntryPointを指定します。

ViewModelにHiltへの対応を行います。

   :
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

@HiltViewModel
class HomeViewModel @Inject constructor(): ViewModel() {
   :

5行目
ViewModelのclass宣言の前に@HiltViewModelを指定します。
6行目
コンストラクタ@Inject constructor()を追記します。

appモジュールからの参照設定

appモジュールから作成したFragmentモジュールを参照できるようにします。

   :
dependencies {
   :
  implementation(project(":ui:home"))
}

4行目
作成したFragmentモジュールを参照します。

参照設定後、『Sync Now』で内容をプロジェクトに反映させます。

他のFragmentモジュールの作成

他のFragmentモジュールも同様に作成します。

※モジュール作成済のディレクトリへは直接モジュールを新規作成できます。
※『Composite Buildへの対応』は各Fragmentモジュールbuild.gradle.ktsへの対応のみになります。

android:studio:application:android-app2121.png

他のFragmentモジュールの作成

モジュール名を『:ui:settings』として作成できます。

今回は、settingslistingの2つのFragmentモジュールを追加しました。

android/studio/application/fragment.txt · 最終更新: 2024/01/12 by プログレス合同会社