camdaochemgio、編集前からあなたの質問を理解しました。
Set (一意の値を格納する) について話しているので、この getValues() 関数は、データのプリセットに基づいて、値をインデックスに変換する独自の revertValues 関数に入力する必要があります。私はあなたのコードを求めたので、あなた自身のスタイル/用語でこれに対する解決策を書くことで自分自身を表現することができました.
ソリューション:
MultiSelectListPreferenceのドキュメントで次のメソッドに気付きました:
int findIndexOfValue(String value)
しかし、オブジェクトへのそのような参照を保存しないので、このクラスを作成して MultiSelectListPreference を拡張しました(新しいファイルで!):
public class DataHolder extends MultiSelectListPreference {
// note: AttributeSet is needed in super class
public DataHolder(Context context,AttributeSet attrs) {
super(context, attrs);
List<CharSequence> entries = new ArrayList<CharSequence>();
List<CharSequence> entriesValues = new ArrayList<CharSequence>();
/** We could use the String Array like you did in your Q,
* But I preffer this way of populating data -
* It keeps things open and unlimitted.
* If you really want the data picked up from the xml , just use :
* context.getResources().getStringArray(R.array.entries) and
* context.getResources().getStringArray(R.array.entryValues)
* */
entries.add("0");
entries.add("1");
entries.add("2");
entries.add("3");
entries.add("4");
entriesValues.add("Tom");
entriesValues.add("David");
entriesValues.add("Bob");
entriesValues.add("Mary");
entriesValues.add("Chris");
setEntries(entries.toArray(new CharSequence[5]));
setEntryValues(entriesValues.toArray(new CharSequence[5]));
}
}
次に、リスナーにプラグインする必要があります。SettingsFragment クラスで、新しいフィールドを追加するだけです:
private DataHolder dh = null;
コンストラクターを変更して、それを受け入れて初期化します。
public SettingsFragment(Context c) {
dh = new DataHolder(c,null);
}
次のステップ: xml からデータへの参照を削除します。次のようになります。
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<com.example.multiselectpref.DataHolder
android:key="pref_key_name_choice"
android:title="@string/name_choice"
/>
</PreferenceScreen>
リスナーに戻ると、 onSharedPreferenceChanged メソッドで、トーストを次のように変更できます。
toast_message += (dh.findIndexOfValue(name) + ": "+name+" , ");
私のために働く..(フォーク@ https://github.com/li3ro/MultiSelectPrefにコミットされたコード)