2010年9月16日木曜日

Android アプリ設定画面を作成する ListPreference

ListPrefrenceは表示されるリストの中から値を選択するGUIです。


Android アプリ設定画面を作成するで作成したxmlレイアウトにListPreferenceを追加します。


※キーはres/value/ids.xmlでname=list,vlue=listで設定しています。
※タイトル、要約はベタ書きしていますがres/values/strings.xmlで設定します。

エントリーに設定しているのは、リストアイテムの「表示する値」を定義したxmlです。
Entry valuesは、リストアイテムの「実際の値」を定義したxmlです。
これらは「res/values/arrays.xml」に定義します。

リストアイテムの「エントリー」と「Entry values」に定義するxmlを作成します。
「res/values/arrays.xml」を作成します。
追加ボタンをクリックし、ダイアログから「String Array」を選択します。
Nameに配列の名称を設定します。


配列に値を追加していきます。
追加ボタンをクリックし、ダイアログから「Item」を選択します。
Valuesにリストアイテムに「表示する値」を設定します。
※valuesにはベタ書きしていますがres/values/strings.xmlで設定します。

「エントリー」と「Entry values」に設定する配列は「String Array」でなければダメなようです。
「Entry values」に「Integer Array」を設定したかったのですが、リストが表示されませんでした。
また「Entry values」に設定する配列の各要素の値をres/values/ids.xmlで定義したかったのですが、これもダメでした。
res/values/arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

<string-array name="entries">
 <item>@string/list_item_name1</item>
 <item>ItemName2</item>
 <item>ItemName3</item>
</string-array>

<string-array name="entryvalues">
 <item>@string/list_item_value1</item>
 <item>2</item>
 <item>3</item>
</string-array>

</resources>

PreferenceActivityを継承したアクティビティでは作成したxmlレイアウトを、onCreate()メソッドではaddPreferencesFromResource()メソッドでxmlを読み込みます。

ListPreferenceの選択が変更されたイベントを処理するには
Context#findPreference()メソッドで、xmlレイアウトで設定したキーの値をもとにListPreferenceインスタンスを取得します。
このListPreferenceインスタンスにOnPreferenceChangeListenerをハンドルします。
package my.study.android;  

import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.Preference.OnPreferenceChangeListener;

public class MainActivity extends PreferenceActivity {
 
    // リストPreferenceの PreferenceChangeリスナー
    private OnPreferenceChangeListener listPreference_OnPreferenceChangeListener =
        new OnPreferenceChangeListener(){
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                return listPreference_OnPreferenceChange(preference,newValue);
            }};
  

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //xmlレイアウトの読み込み
        this.addPreferencesFromResource(R.xml.pref);
        // キーを基に、リスト設定のインスタンスを取得する
        CharSequence cs = getText(R.string.list);
        ListPreference pref = (ListPreference)findPreference(cs); 
        // リスナーを設定する
        pref.setOnPreferenceChangeListener(listPreference_OnPreferenceChangeListener);
    }
 

    private boolean listPreference_OnPreferenceChange(Preference preference, Object newValue){  
        ListPreference listpref =(ListPreference)preference;
        String summary = String.format("entry=%s , value=%s", listpref.getEntry(),listpref.getValue());
        preference.setSummary(summary);
        return true;       
    }
 
}

【関連項目】
Android プリファレンスの編集
Android アプリ設定画面を作成する
Android アプリ設定画面を作成する CheckBoxPreference
Android アプリ設定画面を作成する EditTextPreference
Android アプリ設定画面を作成するRingtonePreference
Android アプリ設定画面を作成するListPreference
Android アプリ設定画面を作成する 依存関係を設定する
Android アプリ設定画面を作成する PreferenceScreen
Androidアプリ設定画面を作成する PreferenceScreen(別アクティビティ)

0 件のコメント: