設定ファイル保存 では SharedPreferences を利用してデータ保存したが、今回はそれに加えて PreferenceActivity を継承して設定画面を作ってみる。
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
xml/preference.xml を作成する。 ここで、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 化してから対象のキーを判別して取得しています。 何とも力技で、もうちょっとシステマチックできそうな気がしますが。。。