Resourcesクラスを使ったリソースの参照

広告

今までのサンプルではプログラムの中でリソースの利用はレイアウト関係を主に使っていました。今回はプログラムの中からリソースとして定義された文字列や色、画像などを参照する方法を確認します。

リソースを利用するにはResourcesクラスのオブジェクトをまず取得します。Activityクラスで定義されているgetResourcesメソッドを使用します。

Return a Resources instance for your application's package.

戻り値としてandroid.content.res.Resourcesクラスのオブジェクトを取得できます。

具体的には次のように記述します。

Resources res = getResources();

Resourcesクラスでは、リソースIDを引数に指定すると対応するリソースを取得できるメソッドがいくつか用意されています。例えば文字列リソースを取得するにはResourcesクラスで定義されているgetStringメソッドを使用します。

Return the string value associated with a particular resource ID. It will be stripped 
of any styled text information.

Parameters:
  id  The desired resource identifier, as generated by the aapt tool. This integer 
    encodes the package, type, and resource entry. The value 0 is an invalid identifier.
Returns:
  String The string data associated with the resource, stripped of styled text 
    information. 
Throws:
  Resources.NotFoundException  Throws NotFoundException if the given ID does not exist.

引数に文字列リソースのリソースIDを指定すると、対応する文字列リソースを取得します。

具体的には次のように記述します。

Resources res = getResources();
String titleString = res.getString(R.string.title);

同じようにリソースIDを引数に指定してリソースを取得するためのメソッドが用意されています。以下のその一部を記載しました。

boolean getBoolean(int id)
int getColor(int id)
float getDimension(int id)
Drawable getDrawable(int id)
int getInteger(int id)
Movie getMovie(int id)
String[] getStringArray(int id)
CharSequence getText(int id)

Contextクラスのメソッドを使用

文字列リソースに関しては先ほどのようにResourcesクラスのオブジェクトを経由しなくても、Activityクラスの親クラスであるandroid.content.Contextクラスで定義されているgetStringメソッドを使って取得することができます。

Return a localized string from the application's package's default string table.

Parameters:
  resId  Resource id for the string 

引数に文字列リソースのリソースIDを指定すると、対応する文字列リソースを取得します。

具体的には次のように記述します。

String titleString = getString(R.string.title);

なお文字列リソースを取得する場合は、getStringメソッドの他にgetTextメソッドというものも用意されています。使い分けについては改めて別のページで確認します。

サンプルプログラム

では実際に試してみます。「アクティビティの追加」を参考に「Test5_1Activity」をプロジェクトに追加し、起動時にこのアクティビティが呼び出されるように設定します。

今回はテキストを一つ画面に表示し、表示される文字列と色をリソースから参照して設定してみます。

作成された「Test5_1Activity.java」ファイルを次のように記述します。

package jp.javadrive.resource;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.content.res.Resources;

public class Test5_1Activity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.test5_1);

        TextView msg_text = (TextView)findViewById(R.id.msg_text);

        msg_text.setText(getText(R.string.msg));
        Resources res = getResources();
        int msg_color = res.getColor(R.color.textcolor);
        msg_text.setTextColor(msg_color);
    }
}

「test5_1.xml」というファイルを作成し、作成したプロジェクトの「res/layout」ディレクトリに配置します。ファイルの中身は次のようにします。

<?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:id="@+id/msg_text"
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text=""
      />
 </LinearLayout>

続いて作成したプロジェクトの「res/values」ディレクトリに作成されている「strings.xml」ファイルを次のように書き換えます。(もし存在していなかったら新規にファイルを作成して下さい)。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="msg">press the <i>right</i> button</string>
    <string name="app_name">Sampleプログラム</string>
    <string name="hello">hello</string>
</resources>

最後に「colors.xmlというファイルを作成し、先ほどと同じく作成したプロジェクトの「res/values」ディレクトリに配置します。ファイルの中身は次のようにします。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="textcolor">#ff8c00</color>
</resources>

では実行してみます。

p5-1

リソースに登録した色と文字列をテキストに設定することができました。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)