Android リソース(Resources)アクセス

優れた Android アプリケーションの構築には、多くの要素があります。アプリケーションのコーディング以外にも、ビットマップ、色、レイアウト定義、ユーザーインターフェース文字列、アニメーションなど、使用するさまざまな静的コンテンツのリソースに注意を払う必要があります。これらのリソースは通常、プロジェクトの res/ ディレクトリ配下の独立したサブディレクトリに配置されます。

このチュートリアルでは、アプリケーションリソースの整理方法、代替リソースの指定方法、およびアプリケーション内でのアクセス方法を学びます。


eclipseでリソースを整理する

各リソースは、プロジェクトの res/ ディレクトリ内の特定のサブディレクトリに配置する必要があります。たとえば、次は単純なプロジェクトのファイル階層です:

MyProject/
    src/  
        MyActivity.java  
    res/
        drawable/  
            icon.png  
        layout/  
            activity_main.xml
            info.xml
        values/  
            strings.xml 

res/ ディレクトリには、さまざまなサブディレクトリ内にすべてのリソースが含まれています。ここには、1つの画像リソース、2つのレイアウトリソース、および1つの文字列リソースファイルがあります。次の表は、プロジェクト内の res/ ディレクトリでサポートされているリソースの詳細を示しています。

ディレクトリ リソースタイプ
anim/ アニメーションの属性を定義するXMLファイル。res/anim/ フォルダーに保存され、R.anim クラスからアクセスされます。
color/ 色の状態リストを定義するXMLファイル。res/color/ フォルダーに保存され、R.color クラスからアクセスされます。
drawable/ .png、.jpg、.gif、またはXMLファイルなどの画像ファイルで、ビットマップ、状態リスト、シェイプ、アニメーション画像にコンパイルされます。res/drawable/ フォルダーに保存され、R.drawable クラスからアクセスされます。
layout/ ユーザーインターフェースのレイアウトを定義するXMLファイル。res/layout/ フォルダーに保存され、R.layout クラスからアクセスされます。
menu/ アプリケーションのメニュー(オプションメニュー、コンテキストメニュー、サブメニューなど)を定義するXMLファイル。res/menu/ フォルダーに保存され、R.menu クラスからアクセスされます。
raw/ 任意のファイルは元の形式で保存されます。rawファイルを開くには、R.raw.filename というリソースIDに基づいて Resource.openRawResource() を呼び出す必要があります。
values/ 文字列、整数、色などの単純な値を含むXMLファイル。ここでは、フォルダーごとのリソース命名規則をいくつか示します。arrays.xml は配列リソースを表し、R.array クラスからアクセスされます。integers.xml は整数リソースを表し、R.integer クラスからアクセスされます。bools.xml はブール値リソースを表し、R.bool クラスからアクセスされます。colors.xml は色リソースを表し、R.color クラスからアクセスされます。dimens.xml は寸法値を表し、R.dimen クラスからアクセスされます。strings.xml は文字列リソースを表し、R.string クラスからアクセスされます。styles.xml はスタイルリソースを表し、R.style クラスからアクセスされます。
xml/ Resources.getXML() を呼び出すことで、実行時に任意のXMLファイルを読み取ることができます。ここには、実行時に使用するさまざまな設定ファイルを保存できます。

代替リソース

アプリケーションは、特定のデバイス構成に対して代替リソースを提供する必要があります。たとえば、異なる画面解像度には代替の画像リソースを、異なる言語には代替の文字列リソースを提供する必要があります。実行時に、Android は現在のデバイス構成を検出し、アプリケーションに適切なリソースをロードします。

特定の構成に対して一連の代替リソースを決定するには、次の手順に従います:

  • res/ の下に新しいディレクトリを作成し、<resource_name>_<config_qualifier> のように名前を付けます。ここでの resources_name は、上記の表で言及されている任意のリソース(レイアウト、画像など)です。qualifier は、特定の構成で使用するリソースを決定します。さまざまなタイプのリソースの完全な qualifier リストについては、公式ドキュメントを参照してください。
  • このディレクトリに、対応する代替リソースを保存します。これらのリソースファイルは、以下の例で示されているデフォルトのリソースファイル名と同じである必要がありますが、これらのファイルは特定の内容を置き換えます。たとえば、画像のファイル名は同じでも、高解像度の画面では画像の解像度も高くなります。

次は、デフォルト画面の画像と高解像度の代替画像を指定する例です。

MyProject/
   src/
    main/
    java/
       MyActivity.java  
       res/
          drawable/  
            icon.png
            background.png
        drawable-hdpi/  
            icon.png
            background.png  
        layout/  
            activity_main.xml
            info.xml
        values/  
            strings.xml

次は、デフォルト言語のレイアウトとアラビア語の代替レイアウトを指定する別の例です。

MyProject/
   src/
    main/
    java/
       MyActivity.java  
      res/
         drawable/  
            icon.png
            background.png
        drawable-hdpi/  
            icon.png
            background.png  
        layout/  
            activity_main.xml
            info.xml
        layout-ar/
            main.xml
        values/  
            strings.xml

リソースへのアクセス

アプリケーション開発では、定義済みのリソースに、コードまたはXMLファイルを介してアクセスする必要があります。次のセクションでは、これら2つのシナリオでそれぞれリソースにアクセスする方法を説明します。

コードからリソースにアクセスする

Android アプリケーションがコンパイルされると、res/ ディレクトリ内のすべてのリソースのIDを含む R クラスが生成されます。R クラスを使用して、サブクラス+リソース名、またはリソースIDを直接使用して、リソースにアクセスできます。

例

res/drawable/myimage.png にアクセスし、それを ImageView に設定するには、次のコードを使用します:

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);

ここで、最初のコード行は R.id.myimageview を使用して、レイアウトファイル内で myimageview として定義されている ImageView を取得します。2行目は R.drawable.myimage を使用して、res/ の drawable サブディレクトリにある myimage という名前の画像を取得します。

例

次の例を考えてみましょう。res/values/strings.xml に次の定義があります:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string  name="hello">Hello, World!</string>
</resources>

次に、ID が msg の TextView オブジェクトでリソースIDを使用してテキストを設定できます。具体的には次のとおりです:

TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello);

例

次のように定義されたレイアウト res/layout/activity_main.xml を考えます

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent" 
   android:layout_height="fill_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>

このアプリケーションコードは、このレイアウトをアクティビティに読み込みます。onCreate() メソッド内では次のようになります:

public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main_activity);
}

XMLでのアクセス

次の XML リソースファイル res/values/strings.xml を考えます。そこには色リソースと文字列リソースが含まれています -

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="opaque_red">#f00</color>
   <string name="hello">Hello!</string>
</resources>

次に、以下のレイアウトファイルでこれらのリソースを使用して、テキストの色とテキストの内容を設定できます:

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@color/opaque_red"
    android:text="@string/hello" />

さて、前の章で説明した「Hello World!」の例をもう一度見ると、この節のすべての概念についてより深く理解できたはずです。そのため、以前の例を振り返り、さまざまなリソースを使用した基本的な使い方を確認することを強くお勧めします。

その他の拡張