1.

Androidのリソース(res/)|layout・values・drawable・mipmap

編集
この記事の要点
  • Android のリソースはコードと分離された UI 部品。res/ ディレクトリに配置
  • サブディレクトリ: layout/ XML レイアウト、values/ 文字列・色・dimens、drawable/ 画像/シェイプ、mipmap/ アプリアイコン
  • コードからは R.string.app_name / R.drawable.icon でアクセス
  • 画面密度別: mdpi / hdpi / xhdpi / xxhdpi / xxxhdpi、言語別: values-ja / values-en
  • モダンには Vector Drawable + テーマ(Material 3)を活用、Configuration Changes 対応必須

リソースとは

Android のリソースとは、コードと分離して管理されるUI のための静的データのことです。文字列・色・画像・寸法・レイアウト XML などを res/ ディレクトリにまとめ、コードからは R クラス経由で参照します。

こうすることで多言語対応、画面密度対応、ダークモード、横画面/縦画面の出し分けがコード本体を触らずに済みます。

標準ディレクトリ構成

app/src/main/res/
├── layout/                 # 画面レイアウト XML
│   ├── activity_main.xml
│   └── item_user.xml
├── values/                 # 文字列・色・寸法など
│   ├── strings.xml
│   ├── colors.xml
│   ├── dimens.xml
│   ├── styles.xml
│   └── themes.xml
├── values-ja/              # 日本語用
│   └── strings.xml
├── values-night/           # ダークモード
│   └── colors.xml
├── drawable/               # ベクター / シェイプ / 画像
│   ├── ic_home.xml
│   └── bg_button.xml
├── drawable-xxhdpi/        # 高解像度 PNG
│   └── photo.png
├── mipmap-anydpi-v26/      # アイコン (Adaptive Icon)
│   └── ic_launcher.xml
├── mipmap-mdpi 〜 xxxhdpi/  # 旧式アイコン
├── raw/                    # 音声・動画・JSON など
│   └── beep.mp3
├── xml/                    # 任意 XML(widget設定など)
│   └── preferences.xml
├── menu/                   # メニュー XML
│   └── main_menu.xml
└── font/                   # カスタムフォント
    └── roboto.ttf

R クラスからの参照

// 文字列
val title: String = getString(R.string.app_name)

// 色
val color: Int = ContextCompat.getColor(this, R.color.primary)

// 画像
val icon: Drawable? = ContextCompat.getDrawable(this, R.drawable.ic_home)

// 寸法
val padding: Float = resources.getDimension(R.dimen.padding_default)

// レイアウト
setContentView(R.layout.activity_main)

// 文字列フォーマット (placeholder 入り)
val msg = getString(R.string.welcome_message, userName, age)
// strings.xml: <string name="welcome_message">こんにちは %1$s さん (%2$d 歳)</string>

画面密度別のリソース (drawable)

名前密度倍率典型機種
mdpi (基準)~160 dpi1x旧式 (絶滅)
hdpi~240 dpi1.5x2010年代初期
xhdpi~320 dpi2xiPhone 4 相当 / 廉価 Android
xxhdpi~480 dpi3xPixel 6/7/8 等
xxxhdpi~640 dpi4xSamsung Galaxy S 系最上位

たとえばアイコンを 24dp で表示する場合、各密度フォルダに 24/36/48/72/96 px の PNG を配置すると Android が自動選択します。現代では Vector Drawable (XML) で密度非依存にするのが推奨です。

言語・地域別のリソース

フォルダ意味
values/デフォルト(通常英語)
values-ja/日本語
values-en-rUS/英語 (米国)
values-zh-rCN/中国語簡体
values-night/ダークモード
values-w600dp/横幅 600dp 以上(タブレット)
values-land/横画面

Vector Drawable

SVG ライクな XML で密度非依存のアイコンを作れます。Android Studio の Asset Studio → Vector Asset で Material Icons / SVG を取り込めます。

<!-- res/drawable/ic_home.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorOnSurface">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z"/>
</vector>

テーマとスタイル

<!-- res/values/themes.xml -->
<resources>
    <style name="Theme.MyApp" parent="Theme.Material3.DayNight.NoActionBar">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorOnPrimary">@color/on_primary</item>
        <item name="android:statusBarColor">@color/primary</item>
    </style>
</resources>

<!-- res/values-night/themes.xml -->
<resources>
    <style name="Theme.MyApp" parent="Theme.Material3.DayNight.NoActionBar">
        <item name="colorPrimary">@color/primary_dark</item>
    </style>
</resources>

<!-- AndroidManifest.xml -->
<application android:theme="@style/Theme.MyApp">

Configuration Changes(画面回転・言語切替)対策

画面回転や言語変更が起きると Android はActivity を作り直します。リソース XML の文言・色・レイアウトが自動で適切なものに切り替わりますが、コードで持っているデータは失われます。

  • ViewModel に状態を持たせる — Configuration Change 越境
  • onSaveInstanceState で Bundle にプリミティブ値保存
  • 独自対策で android:configChanges="orientation|screenSize" を Manifest に書くと自前で onConfigurationChanged を実装する必要

FAQ

Q: 画像はすべて drawable-xxhdpi に置けばいい?
A: 拡大表示でぼやけることがあります。Vector Drawable に変換、または mdpi/hdpi/xhdpi/xxhdpi の段階で持つのが安全。

Q: 多言語対応で抜けがあるとどうなる?
A: 該当ロケールに該当する strings.xml 内にキーが無い場合、デフォルト(values/strings.xml)にフォールバック。

Q: ColorRes と Color int の違いは?
A: R.color.primaryリソース ID(整数)Color.REDgetColor()ARGB int。getColor は API 23+ で Context 必須に変更されたので、ContextCompat.getColor 推奨。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. リソース (Android アプリケーション)
  2. アクティビティ (Android アプリケーション)
  3. メッセージの表示
  4. データベースの操作 (Android アプリケーション)

最近更新/作成されたページ