コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

Android TIPS No.02 リソースディレクトリの構造

リソースディレクトリの構造

リソースディレクトリは以下のドキュメントで定義されている。
http://developer.android.com/guide/topics/resources/providing-resources.html
リソースはプロジェクト直下のresディレクトリ以下に以下の分類で配置する。

ディレクトリ リソースタイプ
anim Tweenアニメーションを定義するファイル。
color カラーステートリストを定義するファイル。
drawable pngやjpg、gifファイル等のdrawableファイル。
layout ユーザーインターフェースの定義ファイル。
menu オプションメニュー、コンテキストメニュー、サブメニュー等のアプリケーションメニューの定義ファイル。
raw バイナリデータ
values 単純な文字列や数値や色の定義ファイル。
xml 任意のXMLファイル。

リソースは環境や端末の状態により動的に変更することができる。リソースの定義は以下のようになる。

<resource-name>-<config-qualifier>

ここでそれぞれの意味は以下のようになる。

要素 説明
resource-name 先の表で説明したリソースの名前。layout、drawable等。
config-qualifier 特定の設定で使用される修飾子。具体的には以下で説明する。

config-qualifierは「-」区切りで複数指定できる。設定はそれぞれ別のディレクトリに保管する。以下に使用できるconfig-qualifierを示す。先に書いたとおり「-」区切りで複数のconfig-qualifierを指定することができる。その場合には、以下の表に示す順番で使用しなければならない。以下の一覧で特定のバージョンから使用できるようになったもののみバージョンを明示している。

識別子 値(例) 説明
MCC、MNC mcc440
mcc440-mnc10
モバイルの国コード(Mobile Country Code)を指定する。日本はmcc440となる。オプションとして「-」で区切ってモバイルネットワークコード(Mobile Network Code)つまりキャリアも指定できる。MMCの一覧は以下が詳しい。
http://en.wikipedia.org/wiki/Mobile_Network_Code
言語と地域 en、fr、ja、ja-JP ISO 639-1の言語コード。日本語はja。一覧は以下。
http://www.loc.gov/standards/iso639-2/php/code_list.php
また、地域も合わせて指定できる。地域はISO 3166-1-alpha-2で定義されている。日本の場合には地域で言葉が違わないためJPのみがある。一覧は以下。
http://www.iso.org/iso/country_codes/iso_3166_code_lists/english_country_names_and_code_elements.htm
スクリーンサイズ small
normal
large
xlarge
API Level 4から追加された。xlargeのみAPI Level 9で追加された。
サイズの詳細は以下のページのTable 1を参照。
http://developer.android.com/guide/practices/screens_support.html
スクリーンアスペクト long
notlong
API Level 4から追加された。
longは4:3より比率が高いたとえば16:9の解像度。たとえば、WQVGA、WVGA、FWVGA等。
nolongは4:3の比率のスクリーン。たとえば、QVGA、HVGA、VGA等。
スクリーンの向き port
land
portは縦向き。
landは横向き。
ドックモード car
desk
API Level 8から追加された。
carはカードックにある状態。
deskはデスクドックにある状態。
夜間モード night
notnight
API Level 8から追加された。
nightは時間帯が夜間。
nonightは時間帯が昼間。
スクリーン密度(dpi) lppi
mdpi
hdpi
xhdpi
nodpi
API Level 4から追加された。xhdpiはAPI Level 8で追加された。
ldpiは120dpi。mdpiは160dpi。hdpiは240dpi。xhdpiは320dpi。nodpiはbitmapリソースのために使われる。
タッチスクリーンタイプ notouch
stylus
finger
notouchはデバイスがタッチスクリーンでない場合。
stylusはデバイスがスタイラスを使うタイプのタッチスクリーンの場合。
fingerはタッチスクリーンの場合。
利用できるキーボード keysexposed
keyshidden
keyssoft
keysexposedはキーボードが利用可能な状態。
keyshiddenはキーボードが使用不可能な状態。
keyssoftはソフトウェアキーボードが利用可能な状態。
優先テキスト入力メソッド nokeys
qwerty
12key
nokeysはテキスト入力用のハードウェアキーがない。
qwertyはハードウェアのqwertyキーボードが付いている(それが見えている状態かどうかに関わらず。おそらくスライドしてキーを出すようなタイプで見えていなくても、ということ)。
12keyはハードウェアの12-key(通常の電話専用のキー配列の12個のキー)が付いている。
利用可能ナビゲーションキー navexposed
navhidden
navexposedはナビゲーションキーが利用可能。
navhiddenはナビゲーションキーが利用できない。
タッチしない優先ナビゲーションメソッド nonav
dpad
tracball
wheel
nonavは特別なナビゲーション用のキーがない。タッチスクリーンで代用する。
dpadはd-padナビゲーションがある。
tracballはtracballがある。
wheelはwheelがある。
システムバーション(APIレベル) v4
v7
v8
デバイスがサポートするAPIレベル。

ここで1つ例をあげる。スクリーンアスペクトの動作を確認する。プロジェクトを以下の条件で作成する。

項目 内容
Project name TipsActivity2
Build Target Android 1.6
Application name TipsActivity2
Package name sample.ta2
Create Activity TipsActivity2
Min SDK Version 4

動作はWVGAエミュレータVGAエミュレータで確認する。デフォルトのリソースはWVGAに対応させ、notlongでVGAエミュレータ用のリソースを作成する。Eclipseのプラグインは非常に優秀でここでリソースの名称を間違えた場合にエラーが出る。たとえばnotlongとするところをnolongと間違えるとリソース名がおかしいと以下のようにエラーになる。

また名称の順番を間違えても以下のようにエラーになる。

この機能のおかげでリソースのディレクトリの名称を間違えることがない。これは非常に強力な機能である。
まずlayout/main.xmlを以下のようにする。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textColor="#ff0000"
    android:textSize="40sp"
    android:text="ワイドモニタ"
    />
</LinearLayout>

次に4:3用のlayout-notlong/main.xmlを以下のようにする。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textColor="#ff0000"
    android:textSize="40sp"
    android:text="4:3のモニタ"
    />
</LinearLayout>

最後にTipsActivity2.javaを以下のようにする。

package sample.ta2;

import android.app.Activity;
import android.os.Bundle;

public class TipsActivity2 extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

まずWVGAのモニタの実行結果は以下。

次に、VGAのモニタの実行結果。

また、組み合わせの例も確認する。VGAの縦の場合のレイアウトを作成する。layout-notlong-port/main.xmlを以下のようにする。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textColor="#ff0000"
    android:textSize="40sp"
    android:text="4:3のモニタ(縦)"
    />
</LinearLayout>

ファイルを追加後、再度実行し先ほどのVGAで実行し、Ctrl+F11キーで縦表示に切り替える。その実行結果は以下。

同じ縦でもWVGAエミュレータで実行しても動作は先ほどと同じことが確認できる。必要に応じて環境を任意に定義できる。