Browse Source

One more time, https://github.com/afollestad/material-dialogs/issues/776 should be officially fixed

Aidan Follestad 9 years ago
parent
commit
989d036248

+ 6 - 14
commons/src/main/java/com/afollestad/materialdialogs/prefs/MaterialDialogPreference.java

@@ -31,37 +31,29 @@ public class MaterialDialogPreference extends DialogPreference {
     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
     public MaterialDialogPreference(Context context) {
         super(context);
-        init(context, null, 0, 0);
+        init(context, null);
     }
 
     public MaterialDialogPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
-        init(context, attrs, 0, 0);
+        init(context, attrs);
     }
 
     public MaterialDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
-        init(context, attrs, defStyleAttr, 0);
+        init(context, attrs);
     }
 
     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
     public MaterialDialogPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
-        init(context, attrs, defStyleAttr, defStyleRes);
+        init(context, attrs);
     }
 
 
-    private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+    private void init(Context context, AttributeSet attrs) {
         this.context = context;
-        final TypedArray a = context.obtainStyledAttributes(
-                attrs, com.android.internal.R.styleable.Preference, defStyleAttr, defStyleRes);
-        try {
-            final int layoutResource = a.getResourceId(com.android.internal.R.styleable.Preference_layout, 0);
-            if (layoutResource == 0)
-                setLayoutResource(R.layout.md_preference_custom);
-        } finally {
-            a.recycle();
-        }
+        PrefUtil.setLayoutResource(this, attrs);
     }
 
     @Override

+ 6 - 16
commons/src/main/java/com/afollestad/materialdialogs/prefs/MaterialEditTextPreference.java

@@ -5,7 +5,6 @@ import android.annotation.TargetApi;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.res.TypedArray;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Parcel;
@@ -45,38 +44,29 @@ public class MaterialEditTextPreference extends EditTextPreference {
 
     public MaterialEditTextPreference(Context context) {
         super(context);
-        init(context, null, 0, 0);
+        init(context, null);
     }
 
     public MaterialEditTextPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
-        init(context, attrs, 0, 0);
+        init(context, attrs);
     }
 
     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
     public MaterialEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
-        init(context, attrs, defStyleAttr, 0);
+        init(context, attrs);
     }
 
     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
     public MaterialEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
-        init(context, attrs, defStyleAttr, defStyleRes);
+        init(context, attrs);
     }
 
 
-    private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
-        final TypedArray a = context.obtainStyledAttributes(
-                attrs, com.android.internal.R.styleable.Preference, defStyleAttr, defStyleRes);
-        try {
-            final int layoutResource = a.getResourceId(com.android.internal.R.styleable.Preference_layout, 0);
-            if (layoutResource == 0)
-                setLayoutResource(R.layout.md_preference_custom);
-        } finally {
-            a.recycle();
-        }
-
+    private void init(Context context, AttributeSet attrs) {
+        PrefUtil.setLayoutResource(this, attrs);
         int fallback;
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
             fallback = DialogUtils.resolveColor(context, android.R.attr.colorAccent);

+ 6 - 14
commons/src/main/java/com/afollestad/materialdialogs/prefs/MaterialListPreference.java

@@ -33,37 +33,29 @@ public class MaterialListPreference extends ListPreference {
 
     public MaterialListPreference(Context context) {
         super(context);
-        init(context, null, 0, 0);
+        init(context, null);
     }
 
     public MaterialListPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
-        init(context, attrs, 0, 0);
+        init(context, attrs);
     }
 
     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
     public MaterialListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
-        init(context, attrs, defStyleAttr, 0);
+        init(context, attrs);
     }
 
     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
     public MaterialListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
-        init(context, attrs, defStyleAttr, defStyleRes);
+        init(context, attrs);
     }
 
-    private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+    private void init(Context context, AttributeSet attrs) {
         this.context = context;
-        final TypedArray a = context.obtainStyledAttributes(
-                attrs, com.android.internal.R.styleable.Preference, defStyleAttr, defStyleRes);
-        try {
-            final int layoutResource = a.getResourceId(com.android.internal.R.styleable.Preference_layout, 0);
-            if (layoutResource == 0)
-                setLayoutResource(R.layout.md_preference_custom);
-        } finally {
-            a.recycle();
-        }
+        PrefUtil.setLayoutResource(this, attrs);
         if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1)
             setWidgetLayoutResource(0);
     }

+ 6 - 16
commons/src/main/java/com/afollestad/materialdialogs/prefs/MaterialMultiSelectListPreference.java

@@ -4,7 +4,6 @@ import android.annotation.TargetApi;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.res.TypedArray;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Parcel;
@@ -17,7 +16,6 @@ import android.view.View;
 
 import com.afollestad.materialdialogs.DialogAction;
 import com.afollestad.materialdialogs.MaterialDialog;
-import com.afollestad.materialdialogs.commons.R;
 
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -38,24 +36,24 @@ public class MaterialMultiSelectListPreference extends MultiSelectListPreference
 
     public MaterialMultiSelectListPreference(Context context) {
         super(context);
-        init(context, null, 0, 0);
+        init(context, null);
     }
 
     public MaterialMultiSelectListPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
-        init(context, attrs, 0, 0);
+        init(context, attrs);
     }
 
     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
     public MaterialMultiSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
-        init(context, attrs, defStyleAttr, 0);
+        init(context, attrs);
     }
 
     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
     public MaterialMultiSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
-        init(context, attrs, defStyleAttr, defStyleRes);
+        init(context, attrs);
     }
 
     @Override
@@ -65,17 +63,9 @@ public class MaterialMultiSelectListPreference extends MultiSelectListPreference
             mDialog.setItems(entries);
     }
 
-    private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+    private void init(Context context, AttributeSet attrs) {
         this.context = context;
-        final TypedArray a = context.obtainStyledAttributes(
-                attrs, com.android.internal.R.styleable.Preference, defStyleAttr, defStyleRes);
-        try {
-            final int layoutResource = a.getResourceId(com.android.internal.R.styleable.Preference_layout, 0);
-            if (layoutResource == 0)
-                setLayoutResource(R.layout.md_preference_custom);
-        } finally {
-            a.recycle();
-        }
+        PrefUtil.setLayoutResource(this, attrs);
         if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1)
             setWidgetLayoutResource(0);
     }

+ 30 - 0
commons/src/main/java/com/afollestad/materialdialogs/prefs/PrefUtil.java

@@ -0,0 +1,30 @@
+package com.afollestad.materialdialogs.prefs;
+
+import android.content.res.XmlResourceParser;
+import android.preference.Preference;
+import android.util.AttributeSet;
+
+import com.afollestad.materialdialogs.commons.R;
+
+/**
+ * @author Aidan Follestad (afollestad)
+ */
+class PrefUtil {
+
+    private PrefUtil() {
+    }
+
+    public static void setLayoutResource(Preference preference, AttributeSet attrs) {
+        boolean foundLayout = false;
+        for (int i = 0; i < attrs.getAttributeCount(); i++) {
+            final String namespace = ((XmlResourceParser) attrs).getAttributeNamespace(0);
+            if (namespace.equals("http://schemas.android.com/apk/res/android") &&
+                    attrs.getAttributeName(i).equals("layout")) {
+                foundLayout = true;
+                break;
+            }
+        }
+        if (!foundLayout)
+            preference.setLayoutResource(R.layout.md_preference_custom);
+    }
+}

+ 4 - 1
sample/src/main/res/xml-v11/preferences.xml

@@ -6,7 +6,7 @@
         android:dialogMessage="@string/preference_dialog_message"
         android:dialogTitle="@string/preference_dialog_title"
         android:key="unused_key00"
-        android:layout="@layout/md_stub_colorchooser_grid"
+        android:layout="@layout/md_preference_custom"
         android:negativeButtonText="@android:string/cancel"
         android:positiveButtonText="@android:string/ok"
         android:summary="@string/material_dialog_pref_summary"
@@ -16,6 +16,7 @@
         android:entries="@array/preference_values"
         android:entryValues="@array/preference_values"
         android:key="unused_key01"
+        android:layout="@layout/md_preference_custom"
         android:persistent="true"
         android:summary="@string/list_pref_desc"
         android:title="@string/list_pref_title" />
@@ -24,6 +25,7 @@
         android:entries="@array/preference_values"
         android:entryValues="@array/preference_values"
         android:key="unused_key02"
+        android:layout="@layout/md_preference_custom"
         android:persistent="true"
         android:summary="@string/multilist_pref_desc"
         android:title="@string/multilist_pref_title" />
@@ -34,6 +36,7 @@
         android:dialogTitle="@string/edittext_pref_dialogtitle"
         android:inputType="textPersonName"
         android:key="unused_key03"
+        android:layout="@layout/md_preference_custom"
         android:persistent="true"
         android:summary="@string/edittext_pref_desc"
         android:title="@string/edittext_pref_title" />

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

@@ -6,6 +6,7 @@
         android:dialogMessage="@string/preference_dialog_message"
         android:dialogTitle="@string/preference_dialog_title"
         android:key="unused_key00"
+        android:layout="@layout/md_preference_custom"
         android:negativeButtonText="@android:string/cancel"
         android:positiveButtonText="@android:string/ok"
         android:summary="@string/material_dialog_pref_summary"
@@ -15,6 +16,7 @@
         android:entries="@array/preference_values"
         android:entryValues="@array/preference_values"
         android:key="unused_key01"
+        android:layout="@layout/md_preference_custom"
         android:persistent="true"
         android:summary="@string/list_pref_desc"
         android:title="@string/list_pref_title" />
@@ -25,6 +27,7 @@
         android:dialogTitle="@string/edittext_pref_dialogtitle"
         android:inputType="textPersonName"
         android:key="unused_key03"
+        android:layout="@layout/md_preference_custom"
         android:persistent="true"
         android:summary="@string/edittext_pref_desc"
         android:title="@string/edittext_pref_title" />