Browse Source

Added buttonsGravity() Builder method and md_buttons_gravity global theming attribute.

Aidan Follestad 10 years ago
parent
commit
e7b3a3d90f

+ 18 - 5
README.md

@@ -416,6 +416,7 @@ new MaterialDialog.Builder(this)
         .titleGravity(GravityEnum.CENTER_HORIZONTAL)
         .contentGravity(GravityEnum.CENTER_HORIZONTAL)
         .btnStackedGravity(GravityEnum.START)
+        .buttonsGravity(GravityEnum.END)
         .itemsGravity(GravityEnum.END)
         .titleColorRes(R.color.material_red_500)
         .contentColorRes(Color.WHITE)
@@ -555,17 +556,29 @@ or operating system. This behavior can be overridden in your Activity themes:
     -->
     <item name="md_content_gravity">start</item>
     
-    <!-- 
-        This sets the gravity used while displaying the stacked action buttons, defaults to end.
+    <!--
+        This sets the gravity used while displaying the list items (not including custom adapters), defaults to start.
         Can be start, center, or end.
     -->
-    <item name="md_btnstacked_gravity">end</item>
+    <item name="md_items_gravity">start</item>
     
     <!--
-        This sets the gravity used while displaying the list items (not including custom adapters), defaults to start.
+        This sets the gravity used while displaying the dialog action buttons, defaults to start.
+        
+        Start is regular configuration: neutral on the left, positive on the right, 
+                negative to the left of the positive button. Opposite in RTL layouts.
+        Center puts the neutral button in the center, with negative on the left and 
+                positive on the right. Positive and negative switch in RTL layouts.
+        End puts the neutral button on the right, positive on the left, and negative 
+                to the right of the positive button. Opposite in RTL layouts. 
+    -->
+    <item name="md_buttons_gravity">start</item>
+    
+    <!--
+        This sets the gravity used while displaying the stacked action buttons, defaults to end.
         Can be start, center, or end.
     -->
-    <item name="md_items_gravity">start</item>
+    <item name="md_btnstacked_gravity">end</item>
 
 </style>
 ```

+ 71 - 18
library/src/main/java/com/afollestad/materialdialogs/MaterialDialog.java

@@ -623,6 +623,18 @@ public class MaterialDialog extends DialogBase implements
                     //noinspection ResourceType
                     positiveTextView.setTextAlignment(gravityEnumToTextAlignment(mBuilder.btnStackedGravity));
                 }
+            } else {
+                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
+                        RelativeLayout.LayoutParams.WRAP_CONTENT, (int) getContext().getResources().getDimension(R.dimen.md_button_height));
+                // Positive button is on the right when button gravity is start, left when end
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+                    params.addRule(mBuilder.buttonsGravity == GravityEnum.START || mBuilder.buttonsGravity == GravityEnum.CENTER ?
+                            RelativeLayout.ALIGN_PARENT_END : RelativeLayout.ALIGN_PARENT_START);
+                } else {
+                    params.addRule(mBuilder.buttonsGravity == GravityEnum.START || mBuilder.buttonsGravity == GravityEnum.CENTER ?
+                            RelativeLayout.ALIGN_PARENT_RIGHT : RelativeLayout.ALIGN_PARENT_LEFT);
+                }
+                positiveButton.setLayoutParams(params);
             }
         }
 
@@ -642,6 +654,32 @@ public class MaterialDialog extends DialogBase implements
                     //noinspection ResourceType
                     neutralTextView.setTextAlignment(gravityEnumToTextAlignment(mBuilder.btnStackedGravity));
                 }
+            } else {
+                // Neutral button follows buttonsGravity literally.
+                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
+                        RelativeLayout.LayoutParams.WRAP_CONTENT, (int) getContext().getResources().getDimension(R.dimen.md_button_height));
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+                    if (mBuilder.buttonsGravity == GravityEnum.CENTER) {
+                        params.addRule(RelativeLayout.CENTER_HORIZONTAL);
+                        params.addRule(RelativeLayout.START_OF, R.id.buttonDefaultPositive);
+                        params.addRule(RelativeLayout.END_OF, R.id.buttonDefaultNegative);
+                        ((FrameLayout.LayoutParams) neutralTextView.getLayoutParams()).gravity = Gravity.CENTER;
+                    } else {
+                        params.addRule(mBuilder.buttonsGravity == GravityEnum.START ?
+                                RelativeLayout.ALIGN_PARENT_START : RelativeLayout.ALIGN_PARENT_END);
+                    }
+                } else {
+                    if (mBuilder.buttonsGravity == GravityEnum.CENTER) {
+                        params.addRule(RelativeLayout.CENTER_HORIZONTAL);
+                        params.addRule(RelativeLayout.LEFT_OF, R.id.buttonDefaultPositive);
+                        params.addRule(RelativeLayout.RIGHT_OF, R.id.buttonDefaultNegative);
+                        neutralTextView.setGravity(Gravity.CENTER_HORIZONTAL);
+                    } else {
+                        params.addRule(mBuilder.buttonsGravity == GravityEnum.START ?
+                                RelativeLayout.ALIGN_PARENT_LEFT : RelativeLayout.ALIGN_PARENT_RIGHT);
+                    }
+                }
+                neutralButton.setLayoutParams(params);
             }
         }
 
@@ -656,29 +694,38 @@ public class MaterialDialog extends DialogBase implements
             negativeButton.setTag(NEGATIVE);
             negativeButton.setOnClickListener(this);
 
-            if (!isStacked) {
+            if (isStacked) {
+                negativeTextView.setGravity(gravityEnumToGravity(mBuilder.btnStackedGravity));
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+                    //noinspection ResourceType
+                    negativeTextView.setTextAlignment(gravityEnumToTextAlignment(mBuilder.btnStackedGravity));
+                }
+            } else {
                 RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                         RelativeLayout.LayoutParams.WRAP_CONTENT, (int) getContext().getResources().getDimension(R.dimen.md_button_height));
-                if (mBuilder.positiveText != null && positiveButton.getVisibility() == View.VISIBLE) {
-                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
-                        params.addRule(RelativeLayout.START_OF, R.id.buttonDefaultPositive);
-                    } else {
-                        params.addRule(RelativeLayout.LEFT_OF, R.id.buttonDefaultPositive);
-                    }
+                if (mBuilder.buttonsGravity == GravityEnum.CENTER) {
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
+                        params.addRule(RelativeLayout.ALIGN_PARENT_START);
+                    else
+                        params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
                 } else {
-                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
-                        params.addRule(RelativeLayout.ALIGN_PARENT_END);
+                    if (mBuilder.positiveText != null && positiveButton.getVisibility() == View.VISIBLE) {
+                        // There's a positive button, it goes next to that
+                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
+                            params.addRule(mBuilder.buttonsGravity == GravityEnum.START ?
+                                    RelativeLayout.START_OF : RelativeLayout.END_OF, R.id.buttonDefaultPositive);
+                        else
+                            params.addRule(mBuilder.buttonsGravity == GravityEnum.START ?
+                                    RelativeLayout.LEFT_OF : RelativeLayout.RIGHT_OF, R.id.buttonDefaultPositive);
                     } else {
-                        params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
+                        // Negative button replaces positive button position if there's no positive button
+                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
+                            params.addRule(RelativeLayout.ALIGN_PARENT_END);
+                        else
+                            params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                     }
                 }
                 negativeButton.setLayoutParams(params);
-            } else {
-                negativeTextView.setGravity(gravityEnumToGravity(mBuilder.btnStackedGravity));
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
-                    //noinspection ResourceType
-                    negativeTextView.setTextAlignment(gravityEnumToTextAlignment(mBuilder.btnStackedGravity));
-                }
             }
         }
         return true;
@@ -743,6 +790,7 @@ public class MaterialDialog extends DialogBase implements
         protected GravityEnum contentGravity = GravityEnum.START;
         protected GravityEnum btnStackedGravity = GravityEnum.END;
         protected GravityEnum itemsGravity = GravityEnum.START;
+        protected GravityEnum buttonsGravity = GravityEnum.START;
         protected int titleColor = -1;
         protected int contentColor = -1;
         protected CharSequence content;
@@ -846,8 +894,7 @@ public class MaterialDialog extends DialogBase implements
             this.contentGravity = DialogUtils.resolveGravityEnum(context, R.attr.md_content_gravity, this.contentGravity);
             this.btnStackedGravity = DialogUtils.resolveGravityEnum(context, R.attr.md_btnstacked_gravity, this.btnStackedGravity);
             this.itemsGravity = DialogUtils.resolveGravityEnum(context, R.attr.md_items_gravity, this.itemsGravity);
-
-            // TODO action button gravity?
+            this.buttonsGravity = DialogUtils.resolveGravityEnum(context, R.attr.md_buttons_gravity, this.buttonsGravity);
         }
 
         private void checkSingleton() {
@@ -886,6 +933,7 @@ public class MaterialDialog extends DialogBase implements
             this.contentGravity = s.contentGravity;
             this.btnStackedGravity = s.btnStackedGravity;
             this.itemsGravity = s.itemsGravity;
+            this.buttonsGravity = s.buttonsGravity;
         }
 
         public Builder title(@StringRes int titleRes) {
@@ -1040,6 +1088,11 @@ public class MaterialDialog extends DialogBase implements
             return this;
         }
 
+        public Builder buttonsGravity(@NonNull GravityEnum gravity) {
+            this.buttonsGravity = 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.

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

@@ -46,4 +46,5 @@ public class ThemeSingleton {
     public GravityEnum contentGravity = GravityEnum.START;
     public GravityEnum btnStackedGravity = GravityEnum.START;
     public GravityEnum itemsGravity = GravityEnum.START;
+    public GravityEnum buttonsGravity = GravityEnum.START;
 }

+ 9 - 7
library/src/main/res/layout/md_stub_actionbuttons.xml

@@ -12,6 +12,8 @@
         android:id="@+id/buttonDefaultFrame"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/md_neutral_button_margin"
+        android:layout_marginStart="@dimen/md_neutral_button_margin"
         android:layout_marginRight="@dimen/md_button_padding_frame_side"
         android:layout_marginEnd="@dimen/md_button_padding_frame_side"
         android:layout_marginBottom="@dimen/md_button_frame_vertical_padding">
@@ -19,10 +21,8 @@
         <FrameLayout
             android:id="@+id/buttonDefaultNeutral"
             style="@style/MD_ActionButton"
-            android:layout_alignParentLeft="true"
-            android:layout_alignParentStart="true"
-            android:layout_marginLeft="@dimen/md_neutral_button_margin"
-            android:layout_marginStart="@dimen/md_neutral_button_margin">
+            tools:layout_alignParentLeft="true"
+            tools:layout_alignParentStart="true">
 
             <TextView
                 android:layout_width="wrap_content"
@@ -34,7 +34,9 @@
 
         <FrameLayout
             android:id="@+id/buttonDefaultNegative"
-            style="@style/MD_ActionButton">
+            style="@style/MD_ActionButton"
+            tools:toLeftOf="@+id/buttonDefaultPositive"
+            tools:toStartOf="@+id/buttonDefaultPositive">
 
             <TextView
                 android:layout_width="wrap_content"
@@ -47,8 +49,8 @@
         <FrameLayout
             android:id="@+id/buttonDefaultPositive"
             style="@style/MD_ActionButton"
-            android:layout_alignParentRight="true"
-            android:layout_alignParentEnd="true">
+            tools:layout_alignParentRight="true"
+            tools:layout_alignParentEnd="true">
 
             <TextView
                 android:layout_width="wrap_content"

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

@@ -52,4 +52,10 @@
         <enum name="end" value="2" />
     </attr>
 
+    <attr name="md_buttons_gravity" format="enum">
+        <enum name="start" value="0" />
+        <enum name="center" value="1" />
+        <enum name="end" value="2" />
+    </attr>
+
 </resources>