Xamarin.Android 設定画面
設定画面は、設定画面専用のアクティビティであるPreferenceActivityクラスを継承して簡単に作成することができます。
そして、設定画面の部品には、Preferenceクラスを継承した専用クラスが使用されます。
1 Preference部品
設定画面を構成する「部品」として使えるのは、以下の7つです。
・チェックボックス(CheckBoxPreference)
・テキスト入力(EditTextPreference)
・リスト(ListPreference)
・リングトーン(RingtonePreference)
・プレファレンス(Preference)//レイアウトファイルを指定して、カスタムの設定パーツを作る
・プレファレンスカテゴリ(PreferenceCategory)//パーツをグループ化
・プレファレンススクリーン(PreferenceScreen)//1つの設定画面に1つ(ただし入れ子にすることも可能)
また、コードから作成する場合は、下記の2つも利用可能です。
・DialogPreference //専用のダイアログボックスを開く設定用パーツを作成できる
・PrefarenceGroup //PreferenceScreenやPreferenceCategoryの親となるクラス
(1) PreferenceCategory EditTextPreference CheckBoxPreference


カテゴリ表示、エディトテキスト、チェックボックスの定義です。
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <PreferenceCategory android:title="カテゴリ1"> <EditTextPreference android:key="key_editText" android:title="EditTextPreference" android:summary="summary" android:dialogTitle="Dialog Title" android:dialogMessage="Dialog Message" android:defaultValue="Default Value" /> </PreferenceCategory> <PreferenceCategory android:title="カテゴリ2"> <CheckBoxPreference android:key="key_checkBox" android:title="CheckBoxPreference" android:summary="summary" android:summaryOn="Checkbox ON" android:summaryOff="Checkbox OFF" /> </PreferenceCategory> </PreferenceScreen>
(2) ListPreference


リスト形式の選択、ラジオボタングループのようなイメージですが、対象が文字列であることに注意が必要です。
<ListPreference android:key="key_list" android:title="ListPreference" android:entries="@array/listEntries" android:entryValues="@array/listEntryValues" android:dialogTitle="Dialog Title" android:defaultValue="2" />
文字列配列は、String.xmlの方で指定します。
ListPreferenceのandroid:entryValuesは、arrayではエラーとなり、string-arrayでなければならない。(android:entriesの方は、arrayでも動作する)
String.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <array name="listEntries"> <item>ListItem 1</item> <item>ListItem 2</item> <item>ListItem 3</item> <item>ListItem 4</item> </array> <string-array name="listEntryValues"> <item>1</item> <item>2</item> <item>3</item> <item>4</item> </string-array> </resources>
(3) RingtonePreference


音の選択です。
<RingtonePreference android:key="key_RingtonePreference" android:summary="summaru" android:title="RingtonePreference" android:ringtoneType="all" />
ringtoneTypeで以下の選択ができます。
・ringtone:着信音
・notification:通知音
・alarm:アラーム
・all:すべて
2 PreferenceActivityクラスを継承
設定画面は、PreferenceActivityクラスを継承して作成し、OnCreate()の中でAddPreferencesFromResource()を使用してPreference部品レイアウト(xml)を指定します。
なお、タイトルバー非表示でRequestWindowFeatureを使用する場合は、base.OnCreate()の前に記述しないと例外で死にます。
[Activity] public class MyPreferenceActivity : PreferenceActivity{ protected override void OnCreate(Bundle bundle){ //タイトルバーが不要の場合(base.OnCreateの前に記述する) RequestWindowFeature(WindowFeatures.NoTitle); base.OnCreate(bundle); //部品レイアウトの設定 AddPreferencesFromResource(Resource.Layout.Preferences); }
3 自動保存

個々の部品で設定されたデータは、自動的にプリファレンスに保存されます。
ここで使用されているプリファレンスは、シェアド・プリファレンス (Shared Preferences) であり、「/data/data/パッケージ名/shared_prefs/アプリケーション名_preference.xml」にファイルが作成されます。
保存されたファイルの内容は下記のようになっていました。
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="key_editText">TEST Default Value</string> <string name="key_list">4</string> <boolean name="key_checkBox" value="true" /> <string name="key_RingtonePreference">content://media/internal/audio/media/185</string> </map>
4 読み出し
シェアド・プリファレンスに保存される設定データは、PreferenceManager.GetDefaultSharedPreferences()で取得できます。ListPreferenceは、GetIntでなくGetStringで読みだすことに注意してください。
var dsp = PreferenceManager.GetDefaultSharedPreferences(this); var editText = dsp.GetString("key_editText", ""); var list = dsp.GetString("key_list", ""); var checkBox = dsp.GetBoolean("key_checkBox",false); var ringtonePreference = dsp.GetString("key_RingtonePreference", "");