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のそれぞれに対して、イベントリスナーを指定するプログラムの例を示す。

リスト6(PreferenceActivity.java)

ここではリスト3(1)のように、Preference部品のレイアウトファイルmy_preference.xmlが、設定されているものとする。

このプログラムを実行すると、CheckBoxPreferenceとRingtonePreferenceの データが変更された時に、それぞれのSummaryの表示が変更される。

onPreferenceChangeメソッドの戻り値にtrueを返しているが、 これをfaluseに指定するとPreferenceデータの変更がキャンセルされて、データの変更が反映されなくなってしまう。

SharedPreferenceのイベントリスナーを指定する。(onSharedPreferenceChangedイベント)

SharedPreferenceのイベントリスナーを指定すると、 そのSharedPreferenceに属するいずれかのPreferenceデータが変更された時に、イベントを受け取る事ができる。

以下にそのプログラムの例を示す。

リスト7(PreferenceActivity.java)

このプログラムでは、どれか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メソッドを使う。

 

ページのトップへ戻る