Browse Source

Added MaterialMultiSelectListPreference for API 11 and above. Resolved #323.

Aidan Follestad 10 years ago
parent
commit
87e1178bd2

+ 99 - 0
library/src/main/java/com/afollestad/materialdialogs/prefs/MaterialMultiSelectListPreference.java

@@ -0,0 +1,99 @@
+package com.afollestad.materialdialogs.prefs;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Build;
+import android.os.Bundle;
+import android.preference.ListPreference;
+import android.util.AttributeSet;
+import android.view.View;
+
+import com.afollestad.materialdialogs.MaterialDialog;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * This class only works on Honeycomb (API 11) and above.
+ *
+ * @author Aidan Follestad (afollestad)
+ */
+@TargetApi(Build.VERSION_CODES.HONEYCOMB)
+public class MaterialMultiSelectListPreference extends ListPreference {
+
+    private Context context;
+
+    public MaterialMultiSelectListPreference(Context context) {
+        this(context, null);
+    }
+
+    public MaterialMultiSelectListPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(context);
+    }
+
+    private void init(Context context) {
+        this.context = context;
+        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1)
+            setWidgetLayoutResource(0);
+    }
+
+    private String[] getPersistedValues() {
+        Set<String> values = getPreferenceManager().getSharedPreferences().getStringSet(getKey(), null);
+        if (values == null)
+            return null;
+        return values.toArray(new String[values.size()]);
+    }
+
+    private Integer[] getPersistedIndices() {
+        String[] values = getPersistedValues();
+        if (values == null)
+            return null;
+        List<Integer> indices = new ArrayList<>();
+        for (String v : values)
+            indices.add(findIndexOfValue(v));
+        return indices.toArray(new Integer[indices.size()]);
+    }
+
+    private void persistValues(Integer[] indices) {
+        final CharSequence[] values = getEntryValues();
+        Set<String> valueSet = new HashSet<>();
+        for (int index : indices)
+            valueSet.add(values[index].toString());
+        getEditor().putStringSet(getKey(), valueSet).commit();
+    }
+
+    @Override
+    protected void showDialog(Bundle state) {
+        MaterialDialog.Builder builder = new MaterialDialog.Builder(context)
+                .title(getDialogTitle())
+                .content(getDialogMessage())
+                .icon(getDialogIcon())
+                .negativeText(getNegativeButtonText())
+                .positiveText(getPositiveButtonText())
+                .items(getEntries())
+                .itemsCallbackMultiChoice(getPersistedIndices(), new MaterialDialog.ListCallbackMulti() {
+                    @Override
+                    public void onSelection(MaterialDialog dialog, Integer[] which, CharSequence[] text) {
+                        onClick(null, DialogInterface.BUTTON_POSITIVE);
+                        dialog.dismiss();
+                        if (callChangeListener(which) && isPersistent()) {
+                            persistValues(which);
+                        }
+                    }
+                });
+
+        final View contentView = onCreateDialogView();
+        if (contentView != null) {
+            onBindDialogView(contentView);
+            builder.customView(contentView, false);
+        } else {
+            builder.content(getDialogMessage());
+        }
+
+        builder.show();
+    }
+}

+ 3 - 1
sample/src/main/res/values/strings.xml

@@ -126,8 +126,10 @@
     </string-array>
 
     <string name="preference_dialogs">Preference Dialogs</string>
-    <string name="list_pref_title">Material List Preference</string>
+    <string name="list_pref_title">List Preference</string>
     <string name="list_pref_desc">This is an example of a list preference that automatically uses Material Dialogs to show the list dialog.</string>
+    <string name="multilist_pref_title">Multi Select List Preference</string>
+    <string name="multilist_pref_desc">This is an example of a multi select list preference that automatically uses Material Dialogs to show the list dialog.</string>
     <string name="edittext_pref_title">Material EditText Preference</string>
     <string name="edittext_pref_desc">This is an example of an EditText preference that automatically uses Material Dialogs to show the input dialog.</string>
     <string name="edittext_pref_dialogtitle">Enter a Name</string>

+ 9 - 0
sample/src/main/res/xml/preferences.xml

@@ -10,6 +10,15 @@
         android:persistent="true"
         android:layout="@layout/preference_custom" />
 
+    <com.afollestad.materialdialogs.prefs.MaterialMultiSelectListPreference
+        android:key="unused_key3"
+        android:entries="@array/preference_values"
+        android:entryValues="@array/preference_values"
+        android:title="@string/multilist_pref_title"
+        android:summary="@string/multilist_pref_desc"
+        android:persistent="true"
+        android:layout="@layout/preference_custom" />
+
     <com.afollestad.materialdialogs.prefs.MaterialEditTextPreference
         android:key="unused_key2"
         android:title="@string/edittext_pref_title"