設定画面を作る

2011/04/19

設定ファイル保存 では SharedPreferences を利用してデータ保存したが、今回はそれに加えて PreferenceActivity を継承して設定画面を作ってみる。

ListView 項目

values/arrays.xml を作成して項目を追加する。




    
        8:00
        7:00
        6:00
        5:00
        4:00
        3:00
        2:00
        1:00
        0:00
    
    
        8
        7
        6
        5
        4
        3
        2
        1
        0
    
    
        23:00
        22:00
        21:00
        20:00
    
    
        23
        22
        21
        20
    

Preference の構造作成

xml/preference.xml を作成する。 android ここで、PreferenceScreen を追加する事で定型化された設定画面を作成する事ができる。 入れ子にすれば階層化もできます。 PreferenceScreen で設定項目をカテゴライズできます。




    
        
        
    

ListPreferenceの、entries、entryValues に arrays.xml で定義したパラメータを設定するだけ。 ここで疑問に思ったのが、

設定した値のパラメータがない

summary に値を表示できれば良いと思ったが、xml だけで動的に設定できないようだ。

という事で、プログラムソースに記述する必要がある。 かなり美しくないソースだが、とりあえず実装。 [java] import java.util.HashMap; import java.util.Map;

import android.content.SharedPreferences; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceCategory; import android.preference.PreferenceScreen;

public class SettingActivity extends PreferenceActivity { Preference preference; Map<String, String> scheduleStartTimes = new HashMap<String, String>(); Map<String, String> scheduleEndTimes = new HashMap<String, String>();
Preference scheduleStartPref; Preference scheduleEndPref;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preference);

    PreferenceScreen screenPref = (PreferenceScreen)findPreference("preferenceScreen");
    PreferenceCategory scheduleCategoryPref = (PreferenceCategory) screenPref.findPreference("schedulePref");

    scheduleStartPref = (Preference) scheduleCategoryPref.findPreference("schedule_start_time_key");
    String[] scheduleStartTimeValues = getResources().getStringArray(R.array.schedule_start_time_keys);
    String[] scheduleStartTimeKeys = getResources().getStringArray(R.array.schedule_start_time_values);
    for (int i = 0; i < scheduleStartTimeKeys.length; i++) {  
        scheduleStartTimes.put(scheduleStartTimeKeys[i], scheduleStartTimeValues[i]);   
    }
    loadPreference(scheduleStartPref.getSharedPreferences(), "schedule_start_time_key");

    scheduleEndPref = (Preference) scheduleCategoryPref.findPreference("schedule_end_time_key");
    String[] scheduleEndTimeValues = getResources().getStringArray(R.array.schedule_end_time_keys);
    String[] scheduleEndTimeKeys = getResources().getStringArray(R.array.schedule_end_time_values);
    for (int i = 0; i < scheduleEndTimeKeys.length; i++) {  
        scheduleEndTimes.put(scheduleEndTimeKeys[i], scheduleEndTimeValues[i]);     
    }
    loadPreference(scheduleEndPref.getSharedPreferences(), "schedule_end_time_key");
}

@Override
protected void onResume() {
    super.onResume();
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(listener);
}

@Override
protected void onPause() {
    super.onPause();
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(listener);
}

private SharedPreferences.OnSharedPreferenceChangeListener listener = 
    new SharedPreferences.OnSharedPreferenceChangeListener() {

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        loadPreference(sharedPreferences, key);
    }
};

private void loadPreference(SharedPreferences sharedPreferences, String key) {
    String index = sharedPreferences.getString(key, "");
    if (key.equals("schedule_start_time_key")) {
        scheduleStartPref.setSummary(scheduleStartTimes.get(index));
    }
    if (key.equals("schedule_end_time_key")) {
        scheduleEndPref.setSummary(scheduleEndTimes.get(index));
    }
}

} [/java]

onCreate されたときと設定変更後のリスナー SharedPreferences.OnSharedPreferenceChangeListener で summary に設定値を表示しています。

PreferenceActivity を継承しているので、sharedPreferences.getString() で対象の項目の設定値を取得できる。 ただここで問題なのが、entries と entryValues を別途設定していので関連付けが必要。 onCreate で 設定項目を HashMap 化してから対象のキーを判別して取得しています。 何とも力技で、もうちょっとシステマチックできそうな気がしますが。。。

参考サイト

設定画面の作り方(PreferenceActivity)Android 設定画面を作成する