ぷるぷるの雑記

低レイヤーがんばるぞいなブログ. 記事のご利用は自己責任で.

Androidアプリのリソースについてのメモ

以下Android StudioでKotlinを使用した開発を想定. Rクラスの生成場所を除けばJavaでも同じはず.

実行環境

項目
OS Windows11
Android Studio Electric Eel 2022.1.1
開発言語 Kotlin

リソースの定義方法

リソース名とキーについて、以下のことは覚えていきたい.

  1. フォルダ名はあらかじめ定められたものを使わなければならない.
  2. (拡張子以外)ファイル名は任意でキーとして使われる.
  3. 一部のリソースはファイル名ではなくname属性値がキーとして使われる.

フォルダ名

フォルダ名はあらかじめ決められたものでなくてはならない. 仮にresフォルダ以下に適当な名前でフォルダを作成すると、エスクプローラー上はフォルダが作成されるがProjectツールウインドウには表示されない. 逆に、エクスプローラー上でmenuフォルダを作成するとProjectツールウインドウにフォルダが表示される(そんなことしてもメリットがないが).

res/には決まった名前のフォルダしか表示されない

ファイル名

フォルダ名とは対照的に、リソースファイルのファイル名は拡張子を除いて任意につけることが出来る. なんなら、異なるリソースフォルダであれば同名のファイルが存在しても問題ない.

リソースファイル名は任意につけて良い

ただし、各フォルダに対して決まったタグしか定義できない模様.

res/menuでstringを定義しようとしたら怒られた

キーの付け方と参照方法

基本的にxml内では@tag_name/key、Kotlin内ではR.tag_name.keyという名前で参照する. ただし文字列配列のように一部タグ名とは違う名前で参照するリソースもある.

リソースの種類 保存フォルダ キー 参照方法(xml) 参照方法(Kotlin)
プロパティアニメーション res/animator ファイル名 @animator/filename R.animator.filename
トゥイーンアニメーション res/anim ファイル名 @anim/filename R.anim.filename
フレームアニメーション res/drawable ファイル名 @drawable/filename R.drawable.filename
色状態リスト res/color ファイル名 @color/filename R.color.filename
ドローアブル res/drawable ファイル名 @drawable/filename R.drawable.filename
レイアウト res/layout ファイル名 @layout/filename R.layout.filename
メニュー res/menu ファイル名 @menu/filename R.menu.filename
文字列 res/values name属性値 @string/string_name R.string.string_name
文字列配列 res/values name属性値 @array/string_array_name R.array.string_array_name
スタイル res/values name属性値 @style/style_name R.style.style_name
フォント res/font ファイル名 @font/filename R.font.filename
ブール値 res/values name属性値 @bool/bool_name R.bool.bool_name
res/values name属性値 @color/color_name R.color.color_name
ディメンション res/values name属性値 @dimen/dimension_name R.dimen.dimension_name
ID res/values name属性値 @id/name R.id.name
整数 res/values name属性値 @integer/integer_name R.integer.integer_name

name属性は自由に値をつけることが出来るが、一部予約された値がある. 例えば、プロジェクト作成時に自動生成されるres/values/strings.xmlでアプリ名を指定している.

name属性にも一部予約済みの値がある

@+idのつかいどころ

前述のように、layoutファイルやmenuファイルなどはファイル名がキーになる. 一方、/res/values内のファイルに書かれたリソースはその一つ一つにname属性をつけることが出来る. ということは、前者はファイルに書かれた要素をルート要素から参照するのに対し、後者はピンポイントで要素を参照する. だが、layoutやmenu内の要素にリスナを登録する時などはピンポイントで要素を参照したいこともある. そういう時は要素にファイル名でもname属性でもないキーを登録できると便利である. こういう時は@+idをつかって個別にキーをつけるとよい.

Rクラス

ビルド時にRクラスというリソース管理用のクラスが自動生成され、その中の定数という形でリソースは管理される. Java版の場合このRクラスを直で見ることが出来るっぽいが、Kotlinの場合R.txtとして生成されるらしい.

ビルド後にProjectツールウインドウから/app/build/intermediates/runtime_symbol_list/debug/R.txtを選択すると整数の値が表示される.

R.txtの中身

qiita.com

文字列の書式設定

文字列リソースは書式を設定することが出来る. 下の例の場合、%1$sが文字列、%2$dが10進数の整数のプレースホルダーになっている.

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
var text = getString(R.string.welcome_messages, username, mailCount)

参考

developer.android.com

developer.android.com