設定画面を作る

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

ListView 項目

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

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="schedule_start_time_keys">
        <item>8:00</item>
        <item>7:00</item>
        <item>6:00</item>
        <item>5:00</item>
        <item>4:00</item>
        <item>3:00</item>
        <item>2:00</item>
        <item>1:00</item>
        <item>0:00</item>
    </string-array>
    <string-array name="schedule_start_time_values">
        <item>8</item>
        <item>7</item>
        <item>6</item>
        <item>5</item>
        <item>4</item>
        <item>3</item>
        <item>2</item>
        <item>1</item>
        <item>0</item>
    </string-array>
    <string-array name="schedule_end_time_keys">
        <item>23:00</item>
        <item>22:00</item>
        <item>21:00</item>
        <item>20:00</item>
    </string-array>
    <string-array name="schedule_end_time_values">
        <item>23</item>
        <item>22</item>
        <item>21</item>
        <item>20</item>
    </string-array>
</resources>

Preference の構造作成

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

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
	android:key="preferenceScreen" xmlns:android="http://schemas.android.com/apk/res/android">
	<PreferenceCategory 
		android:title="スケジュール" android:key="schedulePref">
		<ListPreference
			android:key="schedule_start_time_key" 
			android:entryValues="@array/schedule_start_time_values" 
			android:entries="@array/schedule_start_time_keys"
			android:title="スケジュール開始時間" 
			android:summary=" " 
			>
		<ListPreference
			android:key="schedule_end_time_key" 
			android:entries="@array/schedule_end_time_keys" 
			android:entryValues="@array/schedule_end_time_values"
			android:title="スケジュール終了時間" 
			android:summary=" " 
			>
	</PreferenceCategory>
</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 scheduleStartTimes = new HashMap(); Map scheduleEndTimes = new HashMap(); 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 設定画面を作成する
AWS CLI と jq でインスタンス一覧を整形して表示
React と Laravel7 のプロジェクトを作成する
Homebrewインストール-2020年版
3直線で囲まれた範囲塗りつぶし
PuLP で線形最適化問題を解く
カスタムのペジネーションを作る
node-sass を使って sass をコンパイルする
Log ファサードでSQLログを分離して書き出す
いちから始める Docker - 複数のコンテナを使う - (2020年)
いちから始める Docker - docker-compose を使う - (2020年)
AWS ECR を使ってみる
Laravel7 でマルチ認証
Mac に AWS Client を設定する
Laravel 7 リリース
v-html でHTML表示する
Laravel で Vue コンポーネントを使う
Laravel で Nuxt.js を使ってみる(Docker環境)
いちから始める Docker -コンテナをビルド- (2020年)
いちから始める Docker -起動してみる- (2020年)
Mac で MySQL(8系)
composer で vendor がインストールできない
Eloquent の日付を Carbon で扱う
webpack 4 入門(npm編)
[Mac]容量を減らす
DIコンテナはじめ
freee SDKを Laravel で使ってみる
freee API を使ってみる
Segueを利用しない画面遷移
Xcode11.3 で XVim2 を利用する
Codable で JSONを読み込み
Webpack入門(yarn編)
MacからLaradock PostgreSQLで接続エラー
Dockerで不要なコンテナ・イメージを削除
Mac で Laradock の構築
yarn インストール&プロジェクト作成
Laravel 6.x 構築(Homestead編)
Composer インストール
nvm インストール
npm install が Mac でエラー
HTMLタグでカーソルが同時処理(ミラーリング)されてしまう
DI(依存性注入)
[Ubuntu]Let's Encryptで無料の証明書を利用する
[Apache]Apache2.4のアクセス制限が変更
[Ubuntu]rootのログインとsudo権限追加
タミヤ マイコンロボット工作セットをMacに接続してみた
pgAdimn4 でブラウザで開けなくなる
Java8 を HomebrewとjEnvで構築
Android Studio環境構築 2019
ロケールの再構築
vagrant グループに Apacheを追加