5.1.2. 設定画面の追加 - 画面クラスの作成

3.アプリ作成 (サンプル)で作成したサンプルアプリに、設定画面を追加していきます。
ここでは、設定画面用のレイアウトを表示して処理するクラスファイル(.java)を作成していきます。

設定画面用クラスは、画面用のクラスなのでメイン画面用のクラスと同様に Activity クラスを継承したクラスを作成します。
このクラスで「5.1.1. 画面レイアウトの作成」で作成したレイアウトの画面を表示する処理を行います。
また、設定値がわかるように各設定の Summary という項目に設定された項目を表示する処理を行います。

メニュー画面イメージ

設定画面用のクラスファイルファイル(.java)を作成

設定画面用のクラスファイル(.java)を新規に作成します。
このファイルは、プロジェクトの [src] - [com.example.splitthecost] フォルダに作成します。
[com.example.splitthecost] フォルダを右クリックし、[新規] → [クラス] を選択します。
以下のダイアログが表示されます。 xmlファイル作成ダイアログ
それぞれの項目は、以下のように設定します。

項目 設定
ソースフォルダ SplitTheCost/src (デフォルトのまま)
パッケージ com.example.splitthecost (デフォルトのまま)
名前 SettingPrefActivity
スーパークラス android.app.Activity

[src] - [com.example.splitthecost] フォルダに、SettingPrefActivity.java ファイルが作成されますので、 このファイルに設定画面用のクラスの表示処理を記述していきます。

クラスファイルの処理記述

上記で作成したファイルを開くと、SettingPrefActivity クラスが記述されています。
ここに、処理を記述していきます。

設定画面用のクラスを作成するためには、このクラスの中に PreferenceFragment クラスを継承したクラスを作成する必要があります。
SettingPrefActivity クラスでは、このクラスの呼び出しを行い表示するだけとなります。

PreferenceFragment クラスを継承するクラスは、PrefFramgentという名称とします。
PrefFragment クラスでは、5.1.1. で作成したレイアウトを関連付ける処理と、 設定が変更されたときに、Summary に現在の設定値を表示する処理を記述します。
まず、SettingPrefActivity.java の全体は以下となります。

package com.example.splitthecost;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.PreferenceFragment;

public class SettingPrefActivity extends Activity {
    
    static public final String PREF_KEY_FRACTION = "key_fraction";
    static public final String PREF_KEY_ROUNDUP = "key_roundup";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // PrefFragmentの呼び出し
        getFragmentManager().beginTransaction().replace(
                android.R.id.content, new PrefFragment()).commit();
    }

    // 設定画面のPrefFragmentクラス    
    public static class PrefFragment extends PreferenceFragment{
        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.setting_pref);
            
            // Summary を設定
            setSummaryFraction();
        }
        
        // 設定値が変更されたときのリスナーを登録
        @Override
        public void onResume() {
            super.onResume();
            SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
            sp.registerOnSharedPreferenceChangeListener(listener);
        }
        
        // 設定値が変更されたときのリスナー登録を解除
        @Override
        public void onPause() {
            super.onPause();
            SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
            sp.unregisterOnSharedPreferenceChangeListener(listener);
        }
        
        // 設定変更時に、Summaryを更新
        private OnSharedPreferenceChangeListener listener 
                                                = new OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(
                                SharedPreferences sharedPreferences, String key) {
                if (key.equals(PREF_KEY_FRACTION)) {
                    setSummaryFraction();
                }
            }
        };
        
        // Fraction の Summary を設定
        private void setSummaryFraction() {
            ListPreference prefFraction = (ListPreference)findPreference(PREF_KEY_FRACTION);
            prefFraction.setSummary(prefFraction.getEntry());
        }        
    }
}

コードが長いので、各処理を順に説明していきます。

// PrefFragment クラスの呼び出し
getFragmentManager().beginTransaction().replace(
        android.R.id.content, new PrefFragment()).commit();

まず getFragmentManager ~ の部分で、インナークラスとして作成した PrefFragment を呼び出す処理を行います。
これにより、この SettingPrefActivity クラスの呼び出しで、設定画面を呼び出すことになります。

// 設定画面の PreferenceFragment クラス
public static class PrefFragment extends PreferenceFragment{
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.setting_pref);
        
        // Summary を設定
        setSummaryFraction();
    }

次に、インナークラスとして作成する PrefFragment クラスの定義です。
このクラスは、PreferenceFragment クラスを継承しますので、 extends PreferenceFragment とします。
addPreferencesFromResource(R.xml.setting_pref) の部分で、設定画面用のレイアウト setting_pref.xml ファイルをこのクラスに関連付けます。
setSummary~ では、画面表示時に現在の設定値を Summary に設定する処理です。

// 設定値が変更されたときのリスナーを登録
@Override
public void onResume() {
    super.onResume();
    SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
    sp.registerOnSharedPreferenceChangeListener(listener);
}

// 設定値が変更されたときのリスナー登録を解除
@Override
public void onPause() {
    super.onPause();
    SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
    sp.unregisterOnSharedPreferenceChangeListener(listener);
}

// 設定変更時に、Summaryを更新
private OnSharedPreferenceChangeListener listener 
                                        = new OnSharedPreferenceChangeListener() {
    @Override
    public void onSharedPreferenceChanged(
                        SharedPreferences sharedPreferences, String key) {
        if (key.equals(PREF_KEY_FRACTION)) {
            setSummaryFraction();
        }
    }
};

OnResume は、画面が表示されるときに呼び出されるメソッドです。
ここで、設定変更のリスナーを登録し、設定変更時の処理を実装できるようにします。
OnPause は、画面が非表示になったときに呼び出されるメソッドです。
ここで、設定変更のリスナー登録を解除します。
上記処理を記述することで、設定変更時に以下のメソッドが呼び出されるようになります。
OnSharedPreferenceChangeListener は、項目の値が変更になったときに呼び出されるメソッドです。
ここで、設定が変更になったときに Summary を更新する処理を行います。

// Fraction の  Summary を設定
private void setSummaryFraction() {
    ListPreference prefFraction = (ListPreference)findPreference(PREF_KEY_FRACTION);
    prefFraction.setSummary(prefFraction.getEntry());
}

最後に、 setSumary~ メソッドでは、設定値を取得して Summary に設定する実際の処理を行います。
findPreference(キー) で、指定した Preference を取得し、setSummary メソッドでその内容を Summary に設定します。
ここでは、ListPrerence の Entry つまり設定リストに表示している文字列を取得し、Summary に設定する処理を行います。

これで、設定画面のクラス作成は完了です。



次は・・・
メイン画面から設定画面を呼び出す処理を実装していきます。
5.2. メイン画面からの遷移