-
-
Save cardil/4754571 to your computer and use it in GitHub Desktop.
| private static OnPreferenceChangeListener autoOnChangeListener = new OnPreferenceChangeListener() { | |
| @Override | |
| public boolean onPreferenceChange(Preference rawPreference, Object newValue) { | |
| List<CharSequence> selected = Arrays.asList((CharSequence[]) newValue); | |
| if (selected.contains("1")) { | |
| // do some work | |
| } | |
| return true; | |
| } | |
| }; |
| package pl.wavesoftware.widget; | |
| import java.util.ArrayList; | |
| import java.util.Arrays; | |
| import java.util.Iterator; | |
| import java.util.List; | |
| import android.app.AlertDialog.Builder; | |
| import android.content.Context; | |
| import android.content.DialogInterface; | |
| import android.content.DialogInterface.OnMultiChoiceClickListener; | |
| import android.content.res.TypedArray; | |
| import android.preference.ListPreference; | |
| import android.util.AttributeSet; | |
| public class MultiSelectListPreference extends ListPreference { | |
| private String separator; | |
| private static final String DEFAULT_SEPARATOR = "\u0001\u0007\u001D\u0007\u0001"; | |
| private boolean[] entryChecked; | |
| public MultiSelectListPreference(Context context, AttributeSet attributeSet) { | |
| super(context, attributeSet); | |
| entryChecked = new boolean[getEntries().length]; | |
| separator = DEFAULT_SEPARATOR; | |
| } | |
| public MultiSelectListPreference(Context context) { | |
| this(context, null); | |
| } | |
| @Override | |
| protected void onPrepareDialogBuilder(Builder builder) { | |
| CharSequence[] entries = getEntries(); | |
| CharSequence[] entryValues = getEntryValues(); | |
| if (entries == null || entryValues == null | |
| || entries.length != entryValues.length) { | |
| throw new IllegalStateException( | |
| "MultiSelectListPreference requires an entries array and an entryValues " | |
| + "array which are both the same length"); | |
| } | |
| restoreCheckedEntries(); | |
| OnMultiChoiceClickListener listener = new DialogInterface.OnMultiChoiceClickListener() { | |
| public void onClick(DialogInterface dialog, int which, boolean val) { | |
| entryChecked[which] = val; | |
| } | |
| }; | |
| builder.setMultiChoiceItems(entries, entryChecked, listener); | |
| } | |
| private CharSequence[] unpack(CharSequence val) { | |
| if (val == null || "".equals(val)) { | |
| return new CharSequence[0]; | |
| } else { | |
| return ((String) val).split(separator); | |
| } | |
| } | |
| /** | |
| * Gets the entries values that are selected | |
| * | |
| * @return the selected entries values | |
| */ | |
| public CharSequence[] getCheckedValues() { | |
| return unpack(getValue()); | |
| } | |
| private void restoreCheckedEntries() { | |
| CharSequence[] entryValues = getEntryValues(); | |
| // Explode the string read in sharedpreferences | |
| CharSequence[] vals = unpack(getValue()); | |
| if (vals != null) { | |
| List<CharSequence> valuesList = Arrays.asList(vals); | |
| for (int i = 0; i < entryValues.length; i++) { | |
| CharSequence entry = entryValues[i]; | |
| entryChecked[i] = valuesList.contains(entry); | |
| } | |
| } | |
| } | |
| @Override | |
| protected void onDialogClosed(boolean positiveResult) { | |
| List<CharSequence> values = new ArrayList<CharSequence>(); | |
| CharSequence[] entryValues = getEntryValues(); | |
| if (positiveResult && entryValues != null) { | |
| for (int i = 0; i < entryValues.length; i++) { | |
| if (entryChecked[i] == true) { | |
| String val = (String) entryValues[i]; | |
| values.add(val); | |
| } | |
| } | |
| String value = join(values, separator); | |
| setSummary(prepareSummary(values)); | |
| setValueAndEvent(value); | |
| } | |
| } | |
| private void setValueAndEvent(String value) { | |
| if (callChangeListener(unpack(value))) { | |
| setValue(value); | |
| } | |
| } | |
| private CharSequence prepareSummary(List<CharSequence> joined) { | |
| List<String> titles = new ArrayList<String>(); | |
| CharSequence[] entryTitle = getEntries(); | |
| CharSequence[] entryValues = getEntryValues(); | |
| int ix = 0; | |
| for (CharSequence value : entryValues) { | |
| if (joined.contains(value)) { | |
| titles.add((String) entryTitle[ix]); | |
| } | |
| ix += 1; | |
| } | |
| return join(titles, ", "); | |
| } | |
| @Override | |
| protected Object onGetDefaultValue(TypedArray typedArray, int index) { | |
| return typedArray.getTextArray(index); | |
| } | |
| @Override | |
| protected void onSetInitialValue(boolean restoreValue, | |
| Object rawDefaultValue) { | |
| String value = null; | |
| CharSequence[] defaultValue; | |
| if (rawDefaultValue == null) { | |
| defaultValue = new CharSequence[0]; | |
| } else { | |
| defaultValue = (CharSequence[]) rawDefaultValue; | |
| } | |
| List<CharSequence> joined = Arrays.asList(defaultValue); | |
| String joinedDefaultValue = join(joined, separator); | |
| if (restoreValue) { | |
| value = getPersistedString(joinedDefaultValue); | |
| } else { | |
| value = joinedDefaultValue; | |
| } | |
| setSummary(prepareSummary(Arrays.asList(unpack(value)))); | |
| setValueAndEvent(value); | |
| } | |
| /** | |
| * Joins array of object to single string by separator | |
| * | |
| * Credits to kurellajunior on this post | |
| * http://snippets.dzone.com/posts/show/91 | |
| * | |
| * @param iterable | |
| * any kind of iterable ex.: <code>["a", "b", "c"]</code> | |
| * @param separator | |
| * separetes entries ex.: <code>","</code> | |
| * @return joined string ex.: <code>"a,b,c"</code> | |
| */ | |
| protected static String join(Iterable<?> iterable, String separator) { | |
| Iterator<?> oIter; | |
| if (iterable == null || (!(oIter = iterable.iterator()).hasNext())) | |
| return ""; | |
| StringBuilder oBuilder = new StringBuilder(String.valueOf(oIter.next())); | |
| while (oIter.hasNext()) | |
| oBuilder.append(separator).append(oIter.next()); | |
| return oBuilder.toString(); | |
| } | |
| } |
| <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > | |
| <pl.wavesoftware.widget.MultiSelectListPreference | |
| android:defaultValue="@array/pref_autoon_defaults" | |
| android:entries="@array/pref_autoon_titles" | |
| android:entryValues="@array/pref_autoon_values" | |
| android:key="autoon" | |
| android:persistent="true" | |
| android:title="@string/pref_autoon_events_title" /> | |
| </PreferenceScreen> |
| <resources> | |
| <string-array name="pref_autoon_values"> | |
| <item>1</item> | |
| <item>2</item> | |
| <item>3</item> | |
| <item>4</item> | |
| </string-array> | |
| <string-array name="pref_autoon_titles"> | |
| <item>If the phone rings</item> | |
| <item>While traveling</item> | |
| <item>While charging</item> | |
| <item>Periodically checks</item> | |
| </string-array> | |
| <string-array name="pref_autoon_defaults"> | |
| <item>2</item> | |
| <item>3</item> | |
| </string-array> | |
| </resources> |
@ercillagorka, the ExamplePartOfActivy has a listener autoChangeListener, and a Preference Object mMultiSelectListPreference . This object will listen to any changes to the preference object mMultiSelectListPreference. If they are some changes in the preference object, you might want to do something
//// ExamplePartOfActivity.java
MultiSelectListPreference mMultiSelectListPreference = new MultiSelectListPreference();
mMultiSelectListPreference.setOnPreferenceChangeListener(autoOnChangeListener) ;
private static OnPreferenceChangeListener autoOnChangeListener = new OnPreferenceChangeListener() {
@OverRide
public boolean onPreferenceChange(Preference rawPreference, Object newValue) {
List selected = Arrays.asList((CharSequence[]) newValue);
if (selected.contains("1")) {
// If they are some changes in the preference object, you might want to do something !
}
return true;
}
};
Line 79 produces the following error:
E/InputEventReceiver: Exception dispatching input event.
E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
E/MessageQueue-JNI: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
at MyMultiSelectListPreference.restoreCheckedEntries(MyMultiSelectListPreference.java:81)
at MyMultiSelectListPreference.onPrepareDialogBuilder(MyMultiSelectListPreference.java:44)
at android.preference.DialogPreference.showDialog(DialogPreference.java:306)
at android.preference.DialogPreference.onClick(DialogPreference.java:277)
at android.preference.Preference.performClick(Preference.java:994)
at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:249)
at android.widget.AdapterView.performItemClick(AdapterView.java:310)
What does the first part? "ExamplePartOfActivity.java"