Browse Source

Fixed https://github.com/afollestad/material-dialogs/issues/776, if you set preference layouts from your XML, they won't be overridden

Aidan Follestad 9 years ago
parent
commit
10314752ac

+ 25 - 5
commons/src/main/java/com/afollestad/materialdialogs/prefs/MaterialDialogPreference.java

@@ -4,6 +4,7 @@ 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;
@@ -30,18 +31,37 @@ public class MaterialDialogPreference extends DialogPreference {
     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
     public MaterialDialogPreference(Context context) {
         super(context);
-        init(context);
+        init(context, null, 0, 0);
     }
 
     public MaterialDialogPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
-        init(context);
+        init(context, attrs, 0, 0);
     }
 
-    private void init(Context context) {
+    public MaterialDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init(context, attrs, defStyleAttr, 0);
+    }
+
+    @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);
+    }
+
+
+    private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         this.context = context;
-        if (getLayoutResource() == 0)
-            setLayoutResource(R.layout.md_preference_custom);
+        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();
+        }
     }
 
     @Override

+ 34 - 7
commons/src/main/java/com/afollestad/materialdialogs/prefs/MaterialEditTextPreference.java

@@ -1,9 +1,11 @@
 package com.afollestad.materialdialogs.prefs;
 
 import android.annotation.SuppressLint;
+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;
@@ -39,12 +41,41 @@ public class MaterialEditTextPreference extends EditTextPreference {
 
     private int mColor = 0;
     private MaterialDialog mDialog;
-    private final EditText mEditText;
+    private EditText mEditText;
+
+    public MaterialEditTextPreference(Context context) {
+        super(context);
+        init(context, null, 0, 0);
+    }
 
     public MaterialEditTextPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
-        if (getDialogLayoutResource() == 0)
-            setLayoutResource(R.layout.md_preference_custom);
+        init(context, attrs, 0, 0);
+    }
+
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    public MaterialEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init(context, attrs, defStyleAttr, 0);
+    }
+
+    @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);
+    }
+
+
+    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();
+        }
 
         int fallback;
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
@@ -59,10 +90,6 @@ public class MaterialEditTextPreference extends EditTextPreference {
         mEditText.setEnabled(true);
     }
 
-    public MaterialEditTextPreference(Context context) {
-        this(context, null);
-    }
-
     @Override
     protected void onAddEditTextToDialogView(@NonNull View dialogView, @NonNull EditText editText) {
         ((ViewGroup) dialogView).addView(editText, new LinearLayout.LayoutParams(

+ 26 - 5
commons/src/main/java/com/afollestad/materialdialogs/prefs/MaterialListPreference.java

@@ -1,8 +1,10 @@
 package com.afollestad.materialdialogs.prefs;
 
+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;
@@ -31,18 +33,37 @@ public class MaterialListPreference extends ListPreference {
 
     public MaterialListPreference(Context context) {
         super(context);
-        init(context);
+        init(context, null, 0, 0);
     }
 
     public MaterialListPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
-        init(context);
+        init(context, attrs, 0, 0);
     }
 
-    private void init(Context context) {
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    public MaterialListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init(context, attrs, defStyleAttr, 0);
+    }
+
+    @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);
+    }
+
+    private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         this.context = context;
-        if (getDialogLayoutResource() == 0)
-            setLayoutResource(R.layout.md_preference_custom);
+        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();
+        }
         if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1)
             setWidgetLayoutResource(0);
     }

+ 26 - 5
commons/src/main/java/com/afollestad/materialdialogs/prefs/MaterialMultiSelectListPreference.java

@@ -4,6 +4,7 @@ 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;
@@ -36,12 +37,25 @@ public class MaterialMultiSelectListPreference extends MultiSelectListPreference
     private MaterialDialog mDialog;
 
     public MaterialMultiSelectListPreference(Context context) {
-        this(context, null);
+        super(context);
+        init(context, null, 0, 0);
     }
 
     public MaterialMultiSelectListPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
-        init(context);
+        init(context, attrs, 0, 0);
+    }
+
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    public MaterialMultiSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init(context, attrs, defStyleAttr, 0);
+    }
+
+    @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);
     }
 
     @Override
@@ -51,10 +65,17 @@ public class MaterialMultiSelectListPreference extends MultiSelectListPreference
             mDialog.setItems(entries);
     }
 
-    private void init(Context context) {
+    private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         this.context = context;
-        if (getDialogLayoutResource() == 0)
-            setLayoutResource(R.layout.md_preference_custom);
+        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();
+        }
         if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1)
             setWidgetLayoutResource(0);
     }

+ 7 - 2
core/src/main/java/com/afollestad/materialdialogs/util/DialogUtils.java

@@ -3,6 +3,7 @@ package com.afollestad.materialdialogs.util;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.res.ColorStateList;
+import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.Color;
 import android.graphics.drawable.Drawable;
@@ -97,7 +98,7 @@ public class DialogUtils {
 
     /**
      * Returns a color associated with a particular resource ID
-     * <p>
+     * <p/>
      * Starting in {@link android.os.Build.VERSION_CODES#M}, the returned
      * color will be styled for the specified Context's theme.
      *
@@ -247,7 +248,7 @@ public class DialogUtils {
     }
 
     public static int[] getColorArray(@NonNull Context context, @ArrayRes int array) {
-        if(array == 0) return null;
+        if (array == 0) return null;
         TypedArray ta = context.getResources().obtainTypedArray(array);
         int[] colors = new int[ta.length()];
         for (int i = 0; i < ta.length(); i++)
@@ -255,4 +256,8 @@ public class DialogUtils {
         ta.recycle();
         return colors;
     }
+
+//    public static int getInternalIdentifier(String type, String name) {
+//        return Resources.getSystem().getIdentifier(name, type, "android");
+//    }
 }