Browse Source

Progress with item gravity and new global theme attributes for Gravity. Not done yet, have to add to README too.

Aidan Follestad 10 years ago
parent
commit
3d867ced1c

+ 2 - 2
library/src/main/java/com/afollestad/materialdialogs/DialogInit.java

@@ -139,7 +139,7 @@ class DialogInit {
                 final int fallback = DialogUtils.resolveColor(dialog.getContext(), android.R.attr.textColorPrimary);
                 dialog.title.setTextColor(DialogUtils.resolveColor(dialog.getContext(), R.attr.md_title_color, fallback));
             }
-            dialog.title.setGravity(MaterialDialog.gravityIntToGravity(builder.titleGravity));
+            dialog.title.setGravity(MaterialDialog.gravityEnumToGravity(builder.titleGravity));
         }
 
         // Setup content
@@ -153,7 +153,7 @@ class DialogInit {
             } else {
                 dialog.content.setLinkTextColor(builder.positiveColor);
             }
-            dialog.content.setGravity(MaterialDialog.gravityIntToGravity(builder.contentGravity));
+            dialog.content.setGravity(MaterialDialog.gravityEnumToGravity(builder.contentGravity));
             if (builder.contentColorSet) {
                 dialog.content.setTextColor(builder.contentColor);
             } else {

+ 21 - 10
library/src/main/java/com/afollestad/materialdialogs/MaterialDialog.java

@@ -91,7 +91,7 @@ public class MaterialDialog extends DialogBase implements
     }
 
     @SuppressLint("RtlHardcoded")
-    protected static int gravityIntToGravity(GravityEnum gravity) {
+    protected static int gravityEnumToGravity(GravityEnum gravity) {
         switch (gravity) {
             case CENTER:
                 return Gravity.CENTER_HORIZONTAL;
@@ -605,7 +605,7 @@ public class MaterialDialog extends DialogBase implements
             positiveButton.setTag(POSITIVE);
             positiveButton.setOnClickListener(this);
             if (isStacked)
-                positiveTextView.setGravity(gravityIntToGravity(mBuilder.btnStackedGravity));
+                positiveTextView.setGravity(gravityEnumToGravity(mBuilder.btnStackedGravity));
         }
 
         neutralButton = view.findViewById(
@@ -619,7 +619,7 @@ public class MaterialDialog extends DialogBase implements
             neutralButton.setTag(NEUTRAL);
             neutralButton.setOnClickListener(this);
             if (isStacked)
-                neutralTextView.setGravity(gravityIntToGravity(mBuilder.btnStackedGravity));
+                neutralTextView.setGravity(gravityEnumToGravity(mBuilder.btnStackedGravity));
         }
 
         negativeButton = view.findViewById(
@@ -651,7 +651,7 @@ public class MaterialDialog extends DialogBase implements
                 }
                 negativeButton.setLayoutParams(params);
             } else {
-                negativeTextView.setGravity(gravityIntToGravity(mBuilder.btnStackedGravity));
+                negativeTextView.setGravity(gravityEnumToGravity(mBuilder.btnStackedGravity));
             }
         }
         return true;
@@ -715,6 +715,7 @@ public class MaterialDialog extends DialogBase implements
         protected GravityEnum titleGravity = GravityEnum.START;
         protected GravityEnum contentGravity = GravityEnum.START;
         protected GravityEnum btnStackedGravity = GravityEnum.END;
+        protected GravityEnum itemsGravity = GravityEnum.START;
         protected int titleColor = -1;
         protected int contentColor = -1;
         protected CharSequence content;
@@ -812,7 +813,14 @@ public class MaterialDialog extends DialogBase implements
                     a.recycle();
                 }
             }
+
             checkSingleton();
+            this.titleGravity = DialogUtils.resolveGravityEnum(context, R.attr.md_title_gravity, this.titleGravity);
+            this.contentGravity = DialogUtils.resolveGravityEnum(context, R.attr.md_title_gravity, this.contentGravity);
+            this.btnStackedGravity = DialogUtils.resolveGravityEnum(context, R.attr.md_title_gravity, this.btnStackedGravity);
+            this.itemsGravity = DialogUtils.resolveGravityEnum(context, R.attr.md_title_gravity, this.itemsGravity);
+
+            // TODO action button gravity?
         }
 
         private void checkSingleton() {
@@ -847,6 +855,10 @@ public class MaterialDialog extends DialogBase implements
                 this.btnSelectorNeutral = s.btnSelectorNeutral;
             if (s.btnSelectorNegative != 0)
                 this.btnSelectorNegative = s.btnSelectorNegative;
+            this.titleGravity = s.titleGravity;
+            this.contentGravity = s.contentGravity;
+            this.btnStackedGravity = s.btnStackedGravity;
+            this.itemsGravity = s.itemsGravity;
         }
 
         public Builder title(@StringRes int titleRes) {
@@ -996,6 +1008,11 @@ public class MaterialDialog extends DialogBase implements
             return this;
         }
 
+        public Builder itemsGravity(@NonNull GravityEnum gravity) {
+            this.itemsGravity = gravity;
+            return this;
+        }
+
         /**
          * Pass anything below 0 (such as -1) for the selected index to leave all options unselected initially.
          * Otherwise pass the index of an item that will be selected initially.
@@ -1333,12 +1350,6 @@ public class MaterialDialog extends DialogBase implements
         }
 
         public MaterialDialog build() {
-//            if ((content == null || content.toString().trim().length() == 0) &&
-//                    title != null && (items == null || items.length == 0) &&
-//                    customView == null && adapter == null) {
-//                this.content = this.title;
-//                this.title = null;
-//            }
             return new MaterialDialog(this);
         }
 

+ 88 - 1
library/src/main/java/com/afollestad/materialdialogs/MaterialDialogAdapter.java

@@ -1,11 +1,17 @@
 package com.afollestad.materialdialogs;
 
 import android.annotation.SuppressLint;
+import android.annotation.TargetApi;
+import android.content.res.Configuration;
+import android.os.Build;
+import android.view.Gravity;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ArrayAdapter;
 import android.widget.CheckBox;
+import android.widget.LinearLayout;
 import android.widget.RadioButton;
+import android.widget.RelativeLayout;
 import android.widget.TextView;
 
 import com.afollestad.materialdialogs.util.DialogUtils;
@@ -14,11 +20,13 @@ class MaterialDialogAdapter extends ArrayAdapter<CharSequence> {
 
     private final int itemColor;
     private final MaterialDialog dialog;
+    private final GravityEnum itemGravity;
 
     public MaterialDialogAdapter(MaterialDialog dialog, int resource, int textViewResourceId, CharSequence[] objects) {
         super(dialog.mBuilder.context, resource, textViewResourceId, objects);
         this.dialog = dialog;
-        itemColor = DialogUtils.resolveColor(getContext(), R.attr.md_item_color, dialog.defaultItemColor);
+        this.itemGravity = dialog.mBuilder.itemsGravity;
+        this.itemColor = DialogUtils.resolveColor(getContext(), R.attr.md_item_color, dialog.defaultItemColor);
     }
 
     @Override
@@ -54,6 +62,85 @@ class MaterialDialogAdapter extends ArrayAdapter<CharSequence> {
         tv.setTextColor(itemColor);
         dialog.setTypeface(tv, dialog.mBuilder.regularFont);
         view.setTag(index + ":" + dialog.mBuilder.items[index]);
+        setupGravity(view);
         return view;
     }
+
+    private void setupGravity(View view) {
+        if (view instanceof LinearLayout) {
+            // Basic list item
+            final LinearLayout itemRoot = (LinearLayout) view;
+            final int gravityInt = MaterialDialog.gravityEnumToGravity(itemGravity);
+            itemRoot.setGravity(gravityInt | Gravity.CENTER_VERTICAL);
+            for (int i = 0; i < itemRoot.getChildCount(); i++)
+                ((LinearLayout.LayoutParams) itemRoot.getChildAt(i).getLayoutParams()).gravity = gravityInt;
+        } else {
+            // Choice list item
+            final RelativeLayout itemRoot = (RelativeLayout) view;
+            for (int i = 0; i < itemRoot.getChildCount(); i++)
+                setupGravityRelative(itemRoot.getChildAt(i), i);
+        }
+    }
+
+    private void setupGravityRelative(View child, int index) {
+        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) child.getLayoutParams();
+
+        // Layout alignment
+        if (itemGravity == GravityEnum.CENTER) {
+            params.addRule(RelativeLayout.CENTER_HORIZONTAL);
+        } else if (index == 0) {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+                params.addRule(itemGravity == GravityEnum.START ?
+                        RelativeLayout.ALIGN_PARENT_START : RelativeLayout.ALIGN_PARENT_END);
+            } else {
+                params.addRule(itemGravity == GravityEnum.START ?
+                        RelativeLayout.ALIGN_PARENT_LEFT : RelativeLayout.ALIGN_PARENT_RIGHT);
+            }
+        }
+
+        if (index == 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            // Removes the circular background selector from checkboxes or radio buttons on Lollipop
+            child.setBackground(null);
+        }
+
+        // Relative positioning
+        if (index == 1) {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+                params.addRule(itemGravity == GravityEnum.START || itemGravity == GravityEnum.CENTER ?
+                        RelativeLayout.END_OF : RelativeLayout.START_OF, R.id.control);
+            } else {
+                params.addRule(itemGravity == GravityEnum.START || itemGravity == GravityEnum.CENTER ?
+                        RelativeLayout.RIGHT_OF : RelativeLayout.LEFT_OF, R.id.control);
+            }
+        }
+
+        // Margin
+        final int frameMargin = (int) getContext().getResources().getDimension(R.dimen.md_dialog_frame_margin);
+        final int controlMargin = (int) getContext().getResources().getDimension(R.dimen.md_listitem_control_margin);
+        if (index == 0) {
+            if (itemGravity == GravityEnum.START || itemGravity == GravityEnum.CENTER) {
+                params.leftMargin = !isRTL() ? frameMargin : controlMargin;
+                params.rightMargin = isRTL() ? frameMargin : controlMargin;
+            } else {
+                params.leftMargin = !isRTL() ? controlMargin : frameMargin;
+                params.rightMargin = isRTL() ? controlMargin : frameMargin;
+            }
+        } else {
+            if (itemGravity == GravityEnum.START || itemGravity == GravityEnum.CENTER) {
+                params.leftMargin = !isRTL() ? 0 : frameMargin;
+                params.rightMargin = isRTL() ? frameMargin : 0;
+            } else {
+                params.leftMargin = !isRTL() ? frameMargin : 0;
+                params.rightMargin = isRTL() ? 0 : frameMargin;
+            }
+        }
+    }
+
+    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
+    private boolean isRTL() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1)
+            return false;
+        Configuration config = getContext().getResources().getConfiguration();
+        return config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
+    }
 }

+ 5 - 0
library/src/main/java/com/afollestad/materialdialogs/ThemeSingleton.java

@@ -41,4 +41,9 @@ public class ThemeSingleton {
     public int btnSelectorNeutral = 0;
     @DrawableRes
     public int btnSelectorNegative = 0;
+
+    public GravityEnum titleGravity = GravityEnum.START;
+    public GravityEnum contentGravity = GravityEnum.START;
+    public GravityEnum btnStackedGravity = GravityEnum.START;
+    public GravityEnum itemsGravity = GravityEnum.START;
 }

+ 29 - 0
library/src/main/java/com/afollestad/materialdialogs/util/DialogUtils.java

@@ -6,6 +6,8 @@ import android.graphics.Color;
 import android.graphics.drawable.Drawable;
 import android.support.annotation.AttrRes;
 
+import com.afollestad.materialdialogs.GravityEnum;
+
 /**
  * @author Aidan Follestad (afollestad)
  */
@@ -32,6 +34,33 @@ public class DialogUtils {
         }
     }
 
+    private static int gravityEnumToAttrInt(GravityEnum value) {
+        switch (value) {
+            case CENTER:
+                return 1;
+            case END:
+                return 2;
+            default:
+                return 0;
+        }
+    }
+
+    public static GravityEnum resolveGravityEnum(Context context, @AttrRes int attr, GravityEnum defaultGravity) {
+        TypedArray a = context.getTheme().obtainStyledAttributes(new int[]{attr});
+        try {
+            switch (a.getInt(0, gravityEnumToAttrInt(defaultGravity))) {
+                case 1:
+                    return GravityEnum.CENTER;
+                case 2:
+                    return GravityEnum.END;
+                default:
+                    return GravityEnum.START;
+            }
+        } finally {
+            a.recycle();
+        }
+    }
+
     public static Drawable resolveDrawable(Context context, @AttrRes int attr) {
         return resolveDrawable(context, attr, null);
     }

+ 15 - 12
library/src/main/res/layout/md_listitem_multichoice.xml

@@ -1,8 +1,7 @@
-<LinearLayout
+<RelativeLayout
     android:orientation="horizontal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:gravity="center_vertical|start"
     android:descendantFocusability="blocksDescendants"
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools">
@@ -14,11 +13,13 @@
         android:minHeight="@dimen/md_listitem_height"
         android:clickable="false"
         android:gravity="center_vertical"
-        android:layout_gravity="start"
-        android:layout_marginLeft="@dimen/md_dialog_frame_margin"
-        android:layout_marginStart="@dimen/md_dialog_frame_margin"
-        android:layout_marginRight="@dimen/md_listitem_control_margin"
-        android:layout_marginEnd="@dimen/md_listitem_control_margin"
+        android:layout_centerVertical="true"
+        tools:layout_alignParentLeft="true"
+        tools:layout_alignParentStart="true"
+        tools:layout_marginLeft="@dimen/md_dialog_frame_margin"
+        tools:layout_marginStart="@dimen/md_dialog_frame_margin"
+        tools:layout_marginRight="@dimen/md_listitem_control_margin"
+        tools:layout_marginEnd="@dimen/md_listitem_control_margin"
         android:focusable="false"
         android:focusableInTouchMode="false" />
 
@@ -28,10 +29,12 @@
         android:layout_height="wrap_content"
         android:minHeight="@dimen/md_listitem_height"
         tools:text="Item"
-        android:textSize="@dimen/md_listitem_textsize"
         android:gravity="center_vertical"
-        android:layout_gravity="start"
-        android:layout_marginRight="@dimen/md_dialog_frame_margin"
-        android:layout_marginEnd="@dimen/md_dialog_frame_margin" />
+        android:textSize="@dimen/md_listitem_textsize"
+        android:layout_centerVertical="true"
+        tools:layout_toRightOf="@+id/control"
+        tools:layout_toEndOf="@+id/control"
+        tools:layout_marginRight="@dimen/md_dialog_frame_margin"
+        tools:layout_marginEnd="@dimen/md_dialog_frame_margin" />
 
-</LinearLayout>
+</RelativeLayout>

+ 15 - 12
library/src/main/res/layout/md_listitem_singlechoice.xml

@@ -1,8 +1,7 @@
-<LinearLayout
+<RelativeLayout
     android:orientation="horizontal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:gravity="center_vertical|start"
     android:descendantFocusability="blocksDescendants"
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools">
@@ -14,11 +13,13 @@
         android:minHeight="@dimen/md_listitem_height"
         android:clickable="false"
         android:gravity="center_vertical"
-        android:layout_gravity="start"
-        android:layout_marginLeft="@dimen/md_dialog_frame_margin"
-        android:layout_marginStart="@dimen/md_dialog_frame_margin"
-        android:layout_marginRight="@dimen/md_listitem_control_margin"
-        android:layout_marginEnd="@dimen/md_listitem_control_margin"
+        android:layout_centerVertical="true"
+        tools:layout_alignParentLeft="true"
+        tools:layout_alignParentStart="true"
+        tools:layout_marginLeft="@dimen/md_dialog_frame_margin"
+        tools:layout_marginStart="@dimen/md_dialog_frame_margin"
+        tools:layout_marginRight="@dimen/md_listitem_control_margin"
+        tools:layout_marginEnd="@dimen/md_listitem_control_margin"
         android:focusable="false"
         android:focusableInTouchMode="false" />
 
@@ -28,10 +29,12 @@
         android:layout_height="wrap_content"
         android:minHeight="@dimen/md_listitem_height"
         tools:text="Item"
-        android:textSize="@dimen/md_listitem_textsize"
         android:gravity="center_vertical"
-        android:layout_gravity="start"
-        android:layout_marginRight="@dimen/md_dialog_frame_margin"
-        android:layout_marginEnd="@dimen/md_dialog_frame_margin" />
+        android:textSize="@dimen/md_listitem_textsize"
+        android:layout_centerVertical="true"
+        tools:layout_toRightOf="@+id/control"
+        tools:layout_toEndOf="@+id/control"
+        tools:layout_marginRight="@dimen/md_dialog_frame_margin"
+        tools:layout_marginEnd="@dimen/md_dialog_frame_margin" />
 
-</LinearLayout>
+</RelativeLayout>

+ 24 - 0
library/src/main/res/values/attrs.xml

@@ -28,4 +28,28 @@
     <attr name="md_btn_neutral_selector" format="reference" />
     <attr name="md_btn_negative_selector" format="reference" />
 
+    <attr name="md_title_gravity" format="enum">
+        <enum name="start" value="0" />
+        <enum name="center" value="0" />
+        <enum name="right" value="1" />
+    </attr>
+
+    <attr name="md_content_gravity" format="enum">
+        <enum name="start" value="0" />
+        <enum name="center" value="0" />
+        <enum name="right" value="1" />
+    </attr>
+
+    <attr name="md_btnstacked_gravity" format="enum">
+        <enum name="start" value="0" />
+        <enum name="center" value="0" />
+        <enum name="right" value="1" />
+    </attr>
+
+    <attr name="md_items_gravity" format="enum">
+        <enum name="start" value="0" />
+        <enum name="center" value="0" />
+        <enum name="right" value="1" />
+    </attr>
+
 </resources>

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

@@ -378,6 +378,7 @@ public class MainActivity extends ActionBarActivity implements
                 })
                 .alwaysCallMultiChoiceCallback()
                 .positiveText(R.string.choose)
+                .itemsGravity(GravityEnum.END)
                 .show();
     }