Preference(3)-Preference画面に関するTips
Preference部品間に依存関係を持たせたり,イベントを設定したりと、いろいろな使い方ができる。
Preferenceの依存関係
Preference部品間に、依存関係を持たせることができる。
前回のリスト3(1)のレイアウトファイルをさらに修正して、依存関係を設定してみる。
リスト4-リスト3(1)のレイアウトファイルに依存関係を指定(my_preference.xml)
このプログラムを実行すると、CheckBoxPreferenceがチェックされているかどうかにより、 RingtonePreferenceの設定が選択できるかどうかが、変化する。
依存関係を指定するには、21,44行目のようにandroid:dependency属性に依存先のPreferenceのキー値を指定する。
14行目のCheckBoxのandroid:disableDependentsState属性の値をtrueに指定すると、 チェックされている時に依存元のPreference部品がDisableになる。
falseに指定すると、逆にチェックされてない時に、依存元のPreference部品がDisableになる。
依存先のPreference部品は通常、CheckBoxPreferenceを指定するが、 この例のようにリスト4の44行目でListPreferenceの依存先にEditTextPreferenceを指定するとどうなるかためしてみた。
この場合は、EditTextに値が入力されている場合に、ListPreferenceがEnableになるようである。
android:disableDependentsState属性は、 CheckBoxPreferenceのみ指定可能なようで、 EditTextPreferenceには指定できない。
コードを使って設定画面を記述する。
あまり使う事は無いが、xml設定ファイルを使わずに、コードで設定画面を記述する事もできる。
依存関係も含めたリスト4のPreferenceのレイアウトの例を、xmlをファイルを使わずにコードを使って記述すると以下のようになる。
リスト5-リスト4のPreferenceのレイアウトのコードを使って記述(MyPreferenceActivity.java)
ここで注意する点として、setDependencyメソッドを使って依存先のPreferenceを指定する前に addPreferenceメソッドを使ってPreferenceをPreferenceActivityに登録しておく必要がある。
例えば、38行目と39行目および61行目と62行目のコードの順番を逆にして、 PreferenceActivityに登録する前に、依存関係を指定するとエラーとなってしまう。
Preferenceのイベント
設定データが変更された時に、イベントを受け取り、なにがしかの処理をおこなうコードを記述できる。
これには、以下の2つの方法がある。
個々のPreferenceに対してイベントリスナーを指定する。(onPreferenceChangeイベント)
Preferenceに対して個別にイベントリスナを設定すると、 そのPreferenceデータが変更された時にのみ、イベントを受け取る事ができる。
以下に、CheckBoxPreferenceとRingtonePreferenceのそれぞれに対して、イベントリスナーを指定するプログラムの例を示す。
ここではリスト3(1)のように、Preference部品のレイアウトファイルmy_preference.xmlが、設定されているものとする。
このプログラムを実行すると、CheckBoxPreferenceとRingtonePreferenceの データが変更された時に、それぞれのSummaryの表示が変更される。
onPreferenceChangeメソッドの戻り値にtrueを返しているが、 これをfaluseに指定するとPreferenceデータの変更がキャンセルされて、データの変更が反映されなくなってしまう。
SharedPreferenceのイベントリスナーを指定する。(onSharedPreferenceChangedイベント)
SharedPreferenceのイベントリスナーを指定すると、 そのSharedPreferenceに属するいずれかのPreferenceデータが変更された時に、イベントを受け取る事ができる。
以下にそのプログラムの例を示す。
このプログラムでは、どれかPreferenceデータの1つが変化すると、 それに対応するPreferenceのSummaryが変化する。
しかし、なぜかRingtonePreferenceに対してだけは、イベントが受け取る事ができなかった。
PreferenceScreenを入れ子にして複数の設定画面を表示する。
PreferenceScreenを入れ子すると、複数の設定画面を表示する事ができる。
次の例は、リスト3(1)のmy_preference.xmlを修正して、 2つ目のPreferenceCategory以下を別画面(詳細設定)に表示した例である。
リスト8-PreferenceScreenを入れ子にして複数の設定画面を表示(my_preference.xml)
このプログラムを実行すると、以下のように表示される。
入れ子になっている、PreferenceScreenの詳細設定を選択すると、 下図のように2つ目のPreferenceCategory以下の内容が、詳細設定画面に表示される。
Preferenceクラスの活用
Preference部品のスーパクラスであるPreferenceクラスのオブジェクトは、それ自身では設定データを指定できないため、 あまり使い道なさそうであるが、以下のような変わった使い方もできる。
Preferenceにレイアウトやイベントを指定する。
Preferenceに、レイアウトファイルを指定して表示をカスタマイズしたり、Preferenceが選択された時のイベントを設定する事ができる。
以下に、その例を示す。
リスト9(1)-レイアウトファイル(preference_layout.xml)
リスト9(2)-Preferenceを配置するxmlファイル(my_preference.xml)
リスト9(3)-設定画面表示用のActivity(MyPreferenceActivity.java)
このプログラムを実行して、Preferenceを選択すると、以下のようにトーストが表示される。
PreferenceとIntent
PreferenceにIntentを指定して、 Preferenceを選択すると、Intentで指定されたプログラムに画面遷移させる事ができる。
Intentについては「画面遷移」, 「謎めいたインテント」を参照。
以下にその例を示す。
リスト10-PreferenceにIntentを指定(my_preference.xml)
プログラムを実行して、Preferencsを選択すると地図表示画面に遷移する。
Intentをxmlファイルからではなく、コードで指定するにはPreference#setIntentメソッドを使う。