はじめに
Android のプロジェクトにあるいろんなリソースについてです。
AndroidManifest
たぶん iOS でいう info.plist みたいなやつ。
アクティビティはここに全部記載する必要がある。
アプリ名、アプリアイコン、起動時のアクティビティ、パーミッションなどを記載する。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.example.myapp"> <!-- Beware that these values are overridden by the build.gradle file --> <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- This name is resolved to com.example.myapp.MainActivity based upon the package attribute --> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".DisplayMessageActivity" android:parentActivityName=".MainActivity" /> </application> </manifest> |
バージョンとかは build.gradle に記載するよう統一する方がいいかもしれない。。。(どっちに書くんだ?)
resディレクトリ
リソースディレクトリ(res/)は layout/ や values/ などディレクトリごとに色々なタイプのアプリリソースを管理する。
それぞれのリソースディレクトリに修飾子を付けることにより環境に合わせてリソースを変更することができる。
(ex. values-ja-port, values-ja-land のディレクトリを作ると言語が日本語で画面の向きが縦と横のときに別々のリソースを利用できる)
ファイルやディレクトリを res ディレクトリに直接追加してはいけない!!
New -> Folder か New -> Android Resource Directory / File から追加する!!!
修飾子について詳しくは下記参考
設定修飾子の名前
アニメーション
事前定義のアニメーションを定義する。
トゥイーンアニメーションは res/anim/ に保存し、R.anim
クラスからアクセスする。
フレームアニメーションは res/drawable/ に保存し、R.drawable
クラスからアクセスする。
例
トゥイーンアニメーション(ファイル名が ID になる)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
// res/anim/hyperspace_jump.xml <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="1.4" android:fromYScale="1.0" android:toYScale="0.6" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:duration="700" /> <set android:interpolator="@android:anim/accelerate_interpolator" android:startOffset="700"> <scale android:fromXScale="1.4" android:toXScale="0.0" android:fromYScale="0.6" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:duration="400" /> <rotate android:fromDegrees="0" android:toDegrees="-45" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:duration="400" /> </set> </set> // 呼び出し例 val image: ImageView = findViewById(R.id.image) val hyperspaceJump: Animation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump) image.startAnimation(hyperspaceJump) |
フレームアニメーション(ファイル名が ID になる)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// res/drawable/rocket.xml <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/rocket_thrust1" android:duration="200" /> <item android:drawable="@drawable/rocket_thrust2" android:duration="200" /> <item android:drawable="@drawable/rocket_thrust3" android:duration="200" /> </animation-list> // 呼び出し例 val rocketImage: ImageView = findViewById(R.id.rocket_image) rocketImage.setBackgroundResource(R.drawable.rocket_thrust) val rocketAnimation = rocketImage.background if (rocketAnimation is Animatable) { rocketAnimation.start() } |
詳細はアニメーション リソース
色状態リスト
View
の状態に応じて変わる色のリソースを定義する。
res/color/ に保存し、R.color
クラスからアクセスする。(静的な色は res/values/colors.xml に定義する。)
例
ファイル名が ID になる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// res/color/button_text.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:color="#ffff0000"/> <!-- pressed --> <item android:state_focused="true" android:color="#ff0000ff"/> <!-- focused --> <item android:color="#ff000000"/> <!-- default --> </selector> // 呼び出し例 <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/button_text" android:textColor="@color/button_text" /> |
詳細はカラー状態リストリソース
ドローアブル
ビットマップや XML でさまざまなグラフィックを定義する。
res/drawable/ に保存し、R.drawable
クラスからアクセスする。
例
ファイル名が ID になる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// res/drawable/button.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/button_pressed" /> <!-- pressed --> <item android:state_focused="true" android:drawable="@drawable/button_focused" /> <!-- focused --> <item android:state_hovered="true" android:drawable="@drawable/button_focused" /> <!-- hovered --> <item android:drawable="@drawable/button_normal" /> <!-- default --> </selector> // 呼び出し例 <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/button" /> |
詳細はドローアブル リソース
レイアウト
アプリ UI のレイアウトを定義する。
res/layout/ に保存し、R.layout
クラスからアクセスする。
例
ファイル名が ID になる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// res/layout/main_activity.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a TextView" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a Button" /> </LinearLayout> // 呼び出し例 public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main_activity) } |
詳細はレイアウト リソース
メニュー
アプリメニューの内容を定義する。
res/menu/ に保存し、R.menu
クラスからアクセスする。
例
ファイル名が ID になる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// res/menu/example_menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/item1" android:title="@string/item1" android:icon="@drawable/group_item1_icon" app:showAsAction="ifRoom|withText"/> <group android:id="@+id/group"> <item android:id="@+id/group_item1" android:onClick="onGroupItemClick" android:title="@string/group_item1" android:icon="@drawable/group_item1_icon" /> <item android:id="@+id/group_item2" android:onClick="onGroupItemClick" android:title="@string/group_item2" android:icon="@drawable/group_item2_icon" /> </group> <item android:id="@+id/submenu" android:title="@string/submenu_title" app:showAsAction="ifRoom|withText" > <menu> <item android:id="@+id/submenu_item1" android:title="@string/submenu_item1" /> </menu> </item> </menu> // 呼び出し例 override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.example_menu, menu) return true } |
詳細はメニュー リソース
文字列
文字列、文字列配列、数量文字列(複数形)を定義する(文字列の書式設定とスタイル設定も含める)。
res/values/ に保存し、R.string
クラス、R.array
クラス、R.plurals
クラスからアクセスする。
例
文字列(ファイル名は任意、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// res/values/strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello!</string> </resources> // 呼び出し例 XML <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> // 呼び出し例コード val string: String = getString(R.string.hello) |
文字列配列(ファイル名は任意、
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// res/values/strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="planets_array"> <item>Mercury</item> <item>Venus</item> <item>Earth</item> <item>Mars</item> </string-array> </resources> // 呼び出し例 val array: Array = resources.getStringArray(R.array.planets_array) |
数量文字列(複数形)(ファイル名は任意、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// res/values/strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberOfSongsAvailable"> <!-- As a developer, you should always supply "one" and "other" strings. Your translators will know which strings are actually needed for their language. Always include %d in "one" because translators will need to use %d for languages where "one" doesn't mean 1 (as explained above). --> <item quantity="one">%d song found.</item> <item quantity="other">%d songs found.</item> </plurals> </resources> // 呼び出し例 val count = getNumberOfSongsAvailable() val songsFound = resources.getQuantityString(R.plurals.numberOfSongsAvailable, count, count) |
詳細は文字列リソース
複数形はローカライズ対応のめんどくさいポイント。。。
スタイル
UI 要素の外観と形式を定義する。
res/values/ に保存し、R.style
クラスからアクセスする。
例
ファイル名は任意、要素の name が ID になる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// res/values/styles.xml <?xml version="1.0" encoding="utf-8"?> <resources> <style name="CustomText" parent="@style/Text"> <item name="android:textSize">20sp</item> <item name="android:textColor">#008</item> </style> </resources> // 呼び出し例 <?xml version="1.0" encoding="utf-8"?> <EditText style="@style/CustomText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello, World!" /> |
詳細はスタイル リソース
フォント
フォントファミリーを定義し、カスタムフォントを XML に含める。
res/font/ に保存し、R.font
クラスからアクセスする。
例
ファイル名が ID になる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// res/font/lobster.xml <?xml version="1.0" encoding="utf-8"?> <font-family xmlns:android="http://schemas.android.com/apk/res/android"> <font android:fontStyle="normal" android:fontWeight="400" android:font="@font/lobster_regular" /> <font android:fontStyle="italic" android:fontWeight="400" android:font="@font/lobster_italic" /> </font-family> // 呼び出し例 <?xml version="1.0" encoding="utf-8"?> <EditText android:fontFamily="@font/lobster" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello, World!" /> |
詳細はフォント リソース
その他
下記のような基本的な値を静的リソースとして定義する。
- ブール値
ブール値を扱う XML リソース。 - 色
色の値(16 進数)を扱う XML リソース。 - ディメンション
ディメンションの値(と測定単位)を扱う XML リソース。 - ID
アプリリソースとコンポーネントの一意の識別子を提供する XML リソース。 - 整数
整数値を扱う XML リソース。 - 整数配列
整数の配列を提供する XML リソース。 - 型付き配列
TypedArray を提供する XML リソース(ドローアブルの配列に使用できます)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="screen_small">true</bool> <color name="opaque_red">#f00</color> <dimen name="font_size">16sp</dimen> <item type="id" name="dialog_exit" /> <integer name="max_speed">75</integer> <integer-array name="bits"> <item>4</item> <item>8</item> <item>16</item> <item>32</item> </integer-array> <array name="icons"> <item>@drawable/home</item> <item>@drawable/settings</item> <item>@drawable/logout</item> </array> <array name="colors"> <item>#FFFF0000</item> <item>#FF00FF00</item> <item>#FF0000FF</item> </array> </resources> // ブール値 val screenIsSmall: Boolean = resources.getBoolean(R.bool.screen_small) // 色 val color: Int = resources.getColor(R.color.opaque_red) // ディメンション val fontSize: Float = resources.getDimension(R.dimen.font_size) // ID showDialog(R.id.dialog_exit) // 整数 val maxSpeed: Int = resources.getInteger(R.integer.max_speed) // 整数配列 val bits: IntArray = resources.getIntArray(R.array.bits) // 型付き配列 val icons: TypedArray = resources.obtainTypedArray(R.array.icons) val drawable: Drawable = icons.getDrawable(0) val colors: TypedArray = resources.obtainTypedArray(R.array.colors) val color: Int = colors.getColor(0,0) |
詳細はその他のリソースタイプ
その他リソース
CSV や JSON ファイルなど読み込む場合は res/raw/ か assets/ ディレクトリを利用する。
assets を利用する場合は ID が付与されないので AssetManager
で読み込む。使い分けはわからない。。。
XML ファイルの場合は res/xml/ を使える。
さいごに
今までリソースファイル追加するときは毎回やり方検索してやってたけど大体理解した!
画面の向きでリソース切り替えれるのは知らなかった。。。
コメント