連載
» 2012年07月23日 11時05分 UPDATE

Android Tips(17):プリファレンスを使用した設定画面の作成

Androidアプリ開発者のためのTips集。主にアプリの設定情報の保存などに使用されるプリファレンス。今回は、このプリファレンスを利用した標準的な設定画面の作成方法を紹介する。

[秋本耕平(イーフロー),@IT MONOist]
Android Tips

Tips概要と動作検証環境

用途 便利
カテゴリ 画面
レベル 中級
動作確認環境 Android 2.3.3(GingerBread) エミュレータにて動作確認
備考 今回のTipsは上記環境で動作確認・検証を行っています


Tips 17:プリファレンスを使用した設定画面の作成

 前回のTipsでは、Androidにおけるデータ保存の方法の1つ「プリファレンス」を紹介した。

 プリファレンスは、主にアプリの設定情報の保存などに使用されるが、実はプリファレンスを利用して、標準的な設定画面を作成することができる。

 今回は、プリファレンスを使った設定画面の作り方を紹介しよう。

標準的な設定画面

 前回のTipsで紹介したサンプルアプリでは、「名前」と「年齢」を登録するためのUIを手作業で用意していた。

 実は、「PreferenceActivity」という種類の画面を使用すると、設定項目に応じた入力UIを自動的に生成してくれる。PreferenceActivityは、XMLで定義された設定内容に基づいて自動的に入力画面を表示、ユーザーの入力内容をプリファレンスに保存してくれるActivityだ。

 PreferenceActivityを使用すると、XMLの定義から以下のような設定画面を作成してくれる(画像1)。

PreferenceActivityを使用した設定画面の例 画像1 PreferenceActivityを使用した設定画面の例

PreferenceActivity の使用手順

 プリファレンスそのものについては前回のTipsで説明したので、早速、PreferenceActivityの使用手順を説明しよう。PreferenceActivityの使用手順は、以下のようになる。

  • 設定項目定義のXMLを作る
  • Activityの代わりにPreferenceActivityを使って画面を作成する

 まずは簡単な例として、前回と同様にユーザーの名前と年齢を登録するための画面を作成してみよう。

設定項目定義XMLを作る

 PreferenceActivityで表示する設定項目は、あらかじめXMLで定義しておく必要がある。プロジェクトの「res」ディレクトリの下に、「xml」ディレクトリを作成して、その中に適当な名前で設定項目定義のXMLファイルを配置する。

 ユーザーの名前、年齢を登録させるための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="お名前" />
            <EditTextPreference
                android:key="user_age"
                android:title="年齢"
                android:summary="あなたの年齢を教えてください"
                android:dialogTitle="年齢"
                android:inputType="number" />
        </PreferenceCategory>
    </PreferenceScreen>

 EditTextPreferenceタグを2つ定義している。それぞれのタグにはタイトル、説明文、入力ダイアログのタイトルと、値を保存する時のキー名を指定している。年齢の方のEditTextPreferenceタグには数字だけを入力させたいので「android:inputType="number"」が指定してある。

 設定項目は、EditTextの他にもチェックボックス、リスト選択が使用できるが、それについては後述する。なお今回は、上記のXMLを「res/xml/name_and_age_setting.xml」として保存した。

PreferenceActivity を使って画面を作成する

 作成した設定項目定義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)。

画面を開いたところ 画像2 画面を開いたところ

 各設定項目をタップすると、入力用のダイアログが表示される(画像3、4)。既に、その項目がプリファレンスに保存されている場合は、その値がダイアログに入った状態で表示される(画像5)。

それぞれの設定項目をタップすると入力ダイアログが開く(1)それぞれの設定項目をタップすると入力ダイアログが開く(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 );
    }

前回のサンプルアプリを改造して、保存した値を読み込んだ 画像6 前回のサンプルアプリを改造して、保存した値を読み込んだ

テキスト入力以外の設定項目

 最後に、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)。

上記のXMLをPreferenceActivityで表示した場合(1)上記のXMLをPreferenceActivityで表示した場合(2)上記のXMLをPreferenceActivityで表示した場合(3) 画像7、8、9 上記のXMLをPreferenceActivityで表示した場合

Android コーナー

Androidコーナー
「Android(アンドロイド)」の組み込み機器への適用からアプリ開発、レポート、ニュースなどさまざまな技術情報・最新動向をお届けする!!

>>コーナーTOPはこちらから


Copyright© 2017 ITmedia, Inc. All Rights Reserved.