SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

Xamarin.Android 設定画面

【 Xamarin 記事一覧 】

設定画面は、設定画面専用のアクティビティである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", "");

【 Xamarin 記事一覧 】