Browse Source

Added edit text preference and list preference classes and sample code

marchold 10 years ago
parent
commit
d6f26d9bb2

+ 86 - 0
library/src/main/java/com/afollestad/materialdialogs/MaterialEditTextPreference.java

@@ -0,0 +1,86 @@
+package com.afollestad.materialdialogs;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.preference.EditTextPreference;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.FrameLayout;
+
+/**
+ *  @author Marc Holder Kluver (marchold)
+ */
+public class MaterialEditTextPreference extends EditTextPreference {
+    private final Context context;
+    private EditText editText;
+
+    public MaterialEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        this.context = context;
+        editText = new EditText(context,attrs);
+    }
+
+    public MaterialEditTextPreference(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public MaterialEditTextPreference(Context context) {
+        this(context, null, 0);
+    }
+
+    @Override
+    protected void showDialog(Bundle state) {
+        final FrameLayout layout = new FrameLayout(context);
+        int margin = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getContext().getResources().getDisplayMetrics());
+        layout.setPadding(margin,0,margin,0);
+        editText.setText(getText());
+        editText.setId(android.R.id.edit);
+        layout.addView(editText);
+        MaterialDialog.Builder mBuilder = new MaterialDialog.Builder(context);
+        mBuilder.title(getTitle());
+        mBuilder.icon(getDialogIcon());
+        mBuilder.positiveText(android.R.string.ok);
+        mBuilder.customView(layout,false);
+        mBuilder.negativeText(getNegativeButtonText());
+        mBuilder.callback(new MaterialDialog.ButtonCallback() {
+            @Override
+            public void onPositive(MaterialDialog dialog) {
+                super.onPositive(dialog);
+                layout.removeView(editText);
+                String value = editText.getText().toString();
+                if (callChangeListener(value)) {
+                    setText(value);
+                }
+            }
+
+            public void onNegative(MaterialDialog dialog) {
+                layout.removeView(editText);
+            }
+
+            public void onNeutral(MaterialDialog dialog) {
+                layout.removeView(editText);
+            }
+
+
+        });
+
+        final View contentView = onCreateDialogView();
+        if (contentView != null) {
+            onBindDialogView(contentView);
+            mBuilder.customView(contentView);
+        }
+        else
+            mBuilder.content(getDialogMessage());
+
+        mBuilder.show();
+    }
+
+
+
+    public EditText getEditText() {
+        return editText;
+    }
+
+}

+ 60 - 0
library/src/main/java/com/afollestad/materialdialogs/MaterialListPreference.java

@@ -0,0 +1,60 @@
+package com.afollestad.materialdialogs;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.preference.ListPreference;
+import android.util.AttributeSet;
+import android.view.View;
+
+/**
+ * Adapted from http://stackoverflow.com/a/27429926/1247248
+ */
+public class MaterialListPreference extends ListPreference {
+    private MaterialDialog.Builder mBuilder;
+    private Context context;
+
+    public MaterialListPreference(Context context) {
+        super(context);
+        this.context = context;
+    }
+
+    public MaterialListPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        this.context = context;
+    }
+
+    @Override
+    protected void showDialog(Bundle state) {
+        mBuilder = new MaterialDialog.Builder(context);
+        mBuilder.title(getTitle());
+        mBuilder.icon(getDialogIcon());
+        mBuilder.positiveText(null);
+        mBuilder.negativeText(getNegativeButtonText());
+        mBuilder.items(getEntries());
+        mBuilder.itemsCallback(new MaterialDialog.ListCallback() {
+            @Override
+            public void onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) {
+                onClick(null, DialogInterface.BUTTON_POSITIVE);
+                dialog.dismiss();
+
+                if (which >= 0 && getEntryValues() != null) {
+                    String value = getEntryValues()[which].toString();
+                    if (callChangeListener(value))
+                        setValue(value);
+                }
+            }
+        });
+
+        final View contentView = onCreateDialogView();
+        if (contentView != null) {
+            onBindDialogView(contentView);
+            mBuilder.customView(contentView);
+        }
+        else
+            mBuilder.content(getDialogMessage());
+
+        mBuilder.show();
+    }
+
+}

+ 2 - 0
library/src/main/res/values/dimens.xml

@@ -34,4 +34,6 @@
     <dimen name="md_icon_margin">16dp</dimen>
     <dimen name="md_listitem_margin_left">24dp</dimen>
     <dimen name="md_action_corner_radius">2dp</dimen>
+
+    <dimen name="preference_dialog_padding">20dp</dimen>
 </resources>

+ 10 - 6
sample/src/main/AndroidManifest.xml

@@ -1,24 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.afollestad.materialdialogssample">
+    package="com.afollestad.materialdialogssample" >
 
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 
     <application
         android:allowBackup="true"
-        android:label="@string/app_name"
         android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name"
         android:supportsRtl="true"
-        android:theme="@style/AppTheme">
-
+        android:theme="@style/AppTheme" >
         <activity
             android:name=".MainActivity"
-            android:label="@string/app_name">
+            android:label="@string/app_name" >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
+
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-
+        <activity
+            android:name=".MaterialPreferenceActivity"
+            android:label="@string/title_activity_preference" >
+        </activity>
     </application>
 
 </manifest>

+ 8 - 0
sample/src/main/java/com/afollestad/materialdialogssample/MainActivity.java

@@ -1,6 +1,7 @@
 package com.afollestad.materialdialogssample;
 
 import android.content.DialogInterface;
+import android.content.Intent;
 import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
 import android.os.Build;
@@ -172,6 +173,13 @@ public class MainActivity extends ActionBarActivity implements FolderSelectorDia
                 new FolderSelectorDialog().show(MainActivity.this);
             }
         });
+
+        findViewById(R.id.preference_dialogs).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                startActivity(new Intent(getApplicationContext(),MaterialPreferenceActivity.class));
+            }
+        });
     }
 
     private void showBasicNoTitle() {

+ 13 - 0
sample/src/main/java/com/afollestad/materialdialogssample/MaterialPreferenceActivity.java

@@ -0,0 +1,13 @@
+package com.afollestad.materialdialogssample;
+
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+
+
+public class MaterialPreferenceActivity extends PreferenceActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        addPreferencesFromResource(R.xml.preference);
+    }
+}

+ 7 - 0
sample/src/main/res/layout/activity_main.xml

@@ -142,6 +142,13 @@
             android:text="@string/folder_chooser"
             android:layout_marginTop="@dimen/sample_button_spacing" />
 
+        <Button
+            android:id="@+id/preference_dialogs"
+            android:layout_width="match_parent"
+            android:layout_height="56dp"
+            android:text="@string/Preference_Dialog"
+            android:layout_marginTop="@dimen/sample_button_spacing" />
+
     </LinearLayout>
 
 </ScrollView>

+ 7 - 0
sample/src/main/res/menu/killme.xml

@@ -0,0 +1,7 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:context="com.afollestad.materialdialogssample.PreferenceActivity">
+    <item android:id="@+id/action_settings" android:title="@string/action_settings"
+        android:orderInCategory="100" app:showAsAction="never" />
+</menu>

+ 6 - 0
sample/src/main/res/values-w820dp/dimens.xml

@@ -0,0 +1,6 @@
+<resources>
+    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
+         (such as screen margins) for screens with more than 820dp of available width. This
+         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
+    <dimen name="activity_horizontal_margin">64dp</dimen>
+</resources>

+ 7 - 0
sample/src/main/res/values/arrays.xml

@@ -25,4 +25,11 @@
         <item>#FF5722</item>
     </array>
 
+    <string-array name="preference_values">
+        <item>Twitter</item>
+        <item>Google</item>
+        <item>Instagram</item>
+        <item>Facebook</item>
+    </string-array>
+
 </resources>

+ 6 - 0
sample/src/main/res/values/strings.xml

@@ -124,5 +124,11 @@
         <item>Wisconsin</item>
         <item>Wyoming</item>
     </string-array>
+    <string name="title_activity_preference">PreferenceActivity</string>
+
+    <string name="Preference_Dialog">Preference Dialog</string>
+
+    <string name="hello_world">Hello world!</string>
+    <string name="action_settings">Settings</string>
 
 </resources>

+ 16 - 0
sample/src/main/res/xml/preference.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <com.afollestad.materialdialogs.MaterialListPreference
+        android:key="unused_key1"
+        android:entries="@array/preference_values"
+        android:entryValues="@array/preference_values"
+        android:title="Material List Preference" />
+
+    <com.afollestad.materialdialogs.MaterialEditTextPreference
+        android:key="unused_key2"
+        android:title="Material Edit Text Preference"
+        android:inputType="textPersonName"
+        android:dialogTitle="Enter a Name" />
+
+</PreferenceScreen>