第 5 章 グラフィックス 77
6.4 プリファレンス
6.4.1 プリファレンスの基礎
Androidは、通常のファイルに対する読み書きの機能に加えて、「プリファレンス」(preference) と呼ばれる機能を持っています。
プリファレンスというのは、キーと値の組から構成されるデータを永続的に保存する機能の ことです。プリファレンスを保存するために使われるファイルは、「プリファレンスファイル」
(preference file)と呼ばれます。プリファレンスファイルは、
/data/data/パッケージ名/shared_prefs というディレクトリに作られます。
プリファレンスファイルの内容は、mapという要素型の要素をルート要素とするXML文書で す。キーと値の組は、map要素の子供になっている、stringという要素型の要素によってあら わされます。string要素は、
<string name="キー">値</string>
という形で、キーと値の組を記述します。
6.4.2 プリファレンスオブジェクトの取得
プリファレンスを利用するためには、書き込みの場合も読み込みの場合も、
android.content.SharedPreferences
というインターフェースを実装したクラスのオブジェクト(このオブジェクトを「プリファレン スオブジェクト」(preference object)と呼ぶことにします)を取得する必要があります。プリファ レンスオブジェクトは、アクティビティーが持っている、
SharedPreferences getSharedPreferences(String name, int mode)
というメソッドを呼び出すことによって取得することができます。このメソッドに渡す引数の1 個目は、プリファレンスファイルの名前です。.xmlという拡張子が自動的に付加されますので、
その左側の部分だけを渡します。そして引数の2個目は、ファイル作成モードです。通常、
android.content.Context.MODE_PRIVATE という定数の値を渡します。
6.4.3 エディターオブジェクトの生成
プリファレンスファイルに対する書き込みを実行するためには、
android.content.SharedPreferences.Editor
というインターフェースを実装したクラスのオブジェクト(このオブジェクトを「エディターオ ブジェクト」(editor object)と呼ぶことにします)を生成する必要があります。
エディターオブジェクトは、プリファレンスオブジェクトが持っている、
SharedPreferences.Editor edit()
というメソッドを呼び出すことによって生成することができます。
6.4.4 プリファレンスファイルへの書き込み
プリファレンスファイルに対してキーと値の組を書き込みたいときは、まず、エディターオブ ジェクトに対して、その組を設定します。組の値の型に応じて、次のメソッドのいずれかを呼び 出すことによって、エディターオブジェクトに対して組を設定することができます。
• SharedPreferences.Editor putBoolean(String key, boolean value)
• SharedPreferences.Editor putInt(String key, int value)
• SharedPreferences.Editor putLong(String key, long value)
• SharedPreferences.Editor putFloat(String key, float value)
• SharedPreferences.Editor putString(String key, String value) これらのメソッドに渡す引数は、1個目がキーで、2個目が値です。
6.4. プリファレンス 105 エディターオブジェクトに組を設定した段階では、その組は、まだプリファレンスファイルに 書き込まれていません。エディターオブジェクトに設定されている組は、
boolean commit()
というメソッドが呼び出されることによって、プリファレンスファイルに書き込まれます。
6.4.5 プリファレンスファイルからの読み込み
プリファレンスファイルから組を読み込みたいときは、組の値の型に応じて、プリファレンス オブジェクトが持っている次のメソッドのいずれかを呼び出します。
• boolean getBoolean(String key, boolean defValue)
• int getInt(String key, int defValue)
• long getLong(String key, long defValue)
• float getFloat(String key, float defValue)
• String getString(String key, String defValue)
これらのメソッドに渡す引数は、1個目がキーで、2個目は、そのキーを持つ組が存在しなかっ た場合に返すべき値です。呼び出したメソッドが返す値の型と、キーに対応する値の型とが一致 していない場合は、ClassCastExceptionという例外が発生します。
6.4.6 プリファレンスを利用するアプリケーションの例
それでは、プリファレンスファイルに対するデータの読み込みと書き込みを実行するアプリ ケーションを作ってみましょう。
まず最初に、次のようなプロジェクトを作成してください。
Project name preference Application name プリファレンス
Package name org.example.preference Create Activity PreferenceActivity
次に、main.xmlを次のように書き換えてください。
レイアウトXMLの例 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"
<TableLayout>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="1"
<TableRow>>
<TextView android:text="キー"/>
<EditText android:id="@+id/putkey"/>
</TableRow>
<TableRow>
<TextView android:text="値"/>
<EditText android:id="@+id/putvalue"/>
</TableRow>
</TableLayout>
<Button android:id="@+id/put"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="書き込み"
/>
<TableLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="1"
<TableRow>>
<TextView android:text="キー"/>
<EditText android:id="@+id/getkey"/>
</TableRow>
</TableLayout>
<Button android:id="@+id/get"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="読み込み"
/>
<TextView android:id="@+id/getvalue"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
次に、PreferenceActivity.javaを次のように書き換えてください。
プログラムの例 PreferenceActivity.java package org.example.preference;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.Button;
import android.widget.TextView;
import android.content.SharedPreferences;
public class PreferenceActivity extends Activity { public static final String FILENAME = "preference";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Button put = (Button) findViewById(R.id.put);
put.setOnClickListener(new OnClickListener() { public void onClick(View v) {
put();
}
});final Button get = (Button) findViewById(R.id.get);
get.setOnClickListener(new OnClickListener() { public void onClick(View v) {
get();
}); } }
private void put() {
final EditText putkey =
(EditText) findViewById(R.id.putkey);
final EditText putvalue =
(EditText) findViewById(R.id.putvalue);
String key = putkey.getText().toString();
String value = putvalue.getText().toString();
SharedPreferences sp = getSharedPreferences(
FILENAME, MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString(key, value);
editor.commit();
putkey.setText("");
putvalue.setText("");