作成した設定項目定義XMLを使って設定画面を表示するには、PreferenceActivityを使用する。普段アプリケーションの画面はActivityクラスを使用するのだが、ここでは代わりにPreferenceActivityを使う。
以下のサンプルのように使用する。
package jp.test.preference.activity; import android.os.Bundle; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; // Activity の代わりに、PreferenceActivity を継承 public class PreferenceActivityTestActivity extends PreferenceActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 読み書きするプリファレンスのファイル名を指定 PreferenceManager prefMgr = getPreferenceManager(); prefMgr.setSharedPreferencesName( "name_and_age" ); // 定義した設定項目XMLを読み込む addPreferencesFromResource( R.xml.name_and_age_setting ); } }
まず、プリファレンスのファイル名を指定しているが、これは省略可能だ。その場合、デフォルトのファイル名を使用して読み書きが行われる。
次に、先ほど定義した設定項目のXMLをPreferenceActivityに読み込ませている(画像2)。
各設定項目をタップすると、入力用のダイアログが表示される(画像3、4)。既に、その項目がプリファレンスに保存されている場合は、その値がダイアログに入った状態で表示される(画像5)。
PreferenceActivityを使用して保存した場合でも、プリファレンスの読み出し方法は変わらない。ただし、若干注意すべき点がある。それは保存したデータ型の問題だ。
PreferenceActivityを利用してプリファレンスに保存する場合、データは基本的に“文字列”として扱われる。今回の例では、年齢の入力値は数値以外を受け付けないようにしているのだが、それでもプリファレンスに保存する際にはString型で保存されてしまう。
そこで、保存した値を読み出す際も、いったんString型として読み出した上で、int型に変換する必要がある。
/** プリファレンスから「年齢」を取り出す。登録されていなければ -1 を返す */ public int loadAge( Context context ){ // プリファレンスの準備 // SharedPreferences pref = context.getSharedPreferences( "name_and_age", Context.MODE_PRIVATE ); // "user_age" というキーで保存されている値を読み出す // いったん文字列として読み出してから、int にパースする String strAge = pref.getString( "user_age", "-1" ); return Integer.parseInt( strAge ); }
最後に、EditText以外の設定項目について簡単に紹介しておこう。前述したように、PreferenceActivityで表示する設定項目は、テキスト入力だけでなく、チェックボックスやリスト選択を使用できる。
例として、年齢は9歳以下、10代、20代、30代以上から選択してもらい、あいさつの時の敬称有無をチェックボックスで選択させる場合を考えてみる。
まず、リスト選択を使う場合には、あらかじめ選択肢を配列リソースとして登録しておく必要がある。「res/values」ディレクトリに、以下の内容のXMLファイルを作成しよう(ファイル名は何でもよい)。
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- 年齢リストの表示項目 --> <string-array name="age_list"> <item>9歳以下</item> <item>10代</item> <item>20代</item> <item>30代以上</item> </string-array> <!-- 実際にプリファレンスに保存する値 --> <string-array name="age_list_values"> <item>0</item> <item>10</item> <item>20</item> <item>30</item> </string-array> </resources>
次に、設定項目定義のXMLを以下のように書き換える。
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="名前と年齢の登録"> <EditTextPreference android:key="user_name" android:title="お名前" android:summary="あなたのお名前を教えてください" android:dialogTitle="お名前" /> <CheckBoxPreference android:key="need_title" android:defaultValue="true" android:title="敬称をつける" android:summary="あいさつに敬称を付けるかどうか選んでください" /> <ListPreference android:key="user_age" android:title="年齢" android:summary="あなたの年齢を教えてください" android:dialogTitle="年齢" android:entries="@array/age_list" android:entryValues="@array/age_list_values" /> </PreferenceCategory> </PreferenceScreen>
まず、敬称有無を選択するためのチェックボックスを追加した。デフォルトをチェック状態にしたいので、「android:defaultValue="true"」としてある。CheckBoxPreferenceで設定した項目は、booleanとしてプリファレンスに保存されるので、読み出す時にはgetBoolean()メソッドを使用する。
年齢の入力は、EditTextPreferenceからListPreferenceに変更した。選択肢として表示する項目は、android:entries要素で、実際に保存する値はandroid:entryValuesで指定している。ListPreferenceで設定した値は、文字列として保存されるので、読み出し方法は変更しない。
上記のXMLをPreferenceActivityで表示すると、以下のようになる(画像7、8、9)。
≫連載「Androidアプリケーション開発者のためのTips集」の目次
Copyright © ITmedia, Inc. All Rights Reserved.