複数のモジュールで使用する文字列リソースを管理する共通リソースモジュールを作成します。
共通リソースモジュールは、文字列リソースだけを持たせるため、Android Studioのモジュール作成ウィザードを使わずにモジュールを作成します。
/coreディレクトリ直下に、resourcesディレクトリを追加し、最小構成のAndroidビルドファイルbuild.gradle.ktsを作成します。
plugins {
alias(libs.plugins.android.library)
}
android {
namespace = "jp.co.progress_llc.portal.core.resources"
compileSdk = libs.versions.compile.sdk.get().toInt()
defaultConfig.minSdk = libs.versions.min.sdk.get().toInt()
}
dependencies {
}
モジュール作成ウィザードを使わずにモジュールを作成したため、ビルド対象モジュールに手動で追記します。
:
include(":core:resources")
追記後、『同期アイコン』で内容をプロジェクトに反映させます。
:core:resourcesモジュールにsrc/main/res/valuesディレクトリを作成します。
作成したディレクトリ内に文字列リソースファイルstrings.xmlを作成します。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="company_name">プログレス合同会社</string> <string name="app_name">ポータル</string> </resources>
:appモジュールのbuild.gradle.ktsで、共通リソースの会社名とアプリケーション名からmanifestPlaceholdersを設定します。
import org.w3c.dom.Element
import javax.xml.parsers.DocumentBuilderFactory
:
android {
:
defaultConfig {
:
manifestPlaceholders["appLabel"] = "AppNamePlaceholder"
}
}
afterEvaluate {
val coreStringsFile = file("../core/resources/src/main/res/values/strings.xml")
if (coreStringsFile.exists()) {
val doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(coreStringsFile)
doc.documentElement.normalize()
val stringNodes = doc.getElementsByTagName("string")
var companyName = ""
var appName = ""
for (i in 0 until stringNodes.length) {
val node = stringNodes.item(i) as Element
when (node.getAttribute("name")) {
"company_name" -> companyName = node.textContent
"app_name" -> appName = node.textContent
}
}
android.defaultConfig.manifestPlaceholders["appLabel"] = "$companyName$appName"
}
}
:
追記後、『Sync Now』で内容をプロジェクトに反映させます。
アプリケーションの表示名がmanifestPlaceholdersの変数の内容になるように置き換えます。
:
<application
:
android:label="@string/app_name"
android:label="${appLabel}"
:
:appのリソースファイルからapp_nameの定義を削除します。
<resources> <string name="app_name">Portal</string> :