瀏覽代碼

Stacking algorithm fixes.

Aidan Follestad 10 年之前
父節點
當前提交
6053f70452

+ 12 - 13
library/src/main/java/com/afollestad/materialdialogs/MaterialDialog.java

@@ -14,6 +14,7 @@ import android.support.annotation.LayoutRes;
 import android.support.annotation.NonNull;
 import android.support.annotation.NonNull;
 import android.support.annotation.StringRes;
 import android.support.annotation.StringRes;
 import android.text.method.LinkMovementMethod;
 import android.text.method.LinkMovementMethod;
+import android.util.Log;
 import android.view.ContextThemeWrapper;
 import android.view.ContextThemeWrapper;
 import android.view.Gravity;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.LayoutInflater;
@@ -27,7 +28,6 @@ import android.widget.TextView;
 
 
 import com.afollestad.materialdialogs.base.DialogBase;
 import com.afollestad.materialdialogs.base.DialogBase;
 import com.afollestad.materialdialogs.list.ItemProcessor;
 import com.afollestad.materialdialogs.list.ItemProcessor;
-import com.afollestad.materialdialogs.views.MeasureCallbackLinearLayout;
 import com.afollestad.materialdialogs.views.MeasureCallbackScrollView;
 import com.afollestad.materialdialogs.views.MeasureCallbackScrollView;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
@@ -37,7 +37,7 @@ import java.util.List;
 /**
 /**
  * @author Aidan Follestad (afollestad)
  * @author Aidan Follestad (afollestad)
  */
  */
-public class MaterialDialog extends DialogBase implements View.OnClickListener, MeasureCallbackLinearLayout.Callback, MeasureCallbackScrollView.Callback {
+public class MaterialDialog extends DialogBase implements View.OnClickListener, MeasureCallbackScrollView.Callback {
 
 
     private Context mContext;
     private Context mContext;
     private CharSequence positiveText;
     private CharSequence positiveText;
@@ -60,7 +60,6 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
     private int selectedIndex;
     private int selectedIndex;
     private Integer[] selectedIndices;
     private Integer[] selectedIndices;
     private boolean mMeasuredScrollView;
     private boolean mMeasuredScrollView;
-    private Typeface regularFont;
     private Typeface mediumFont;
     private Typeface mediumFont;
     private ItemProcessor mItemProcessor;
     private ItemProcessor mItemProcessor;
 
 
@@ -69,7 +68,6 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
 
 
         this.mContext = builder.context;
         this.mContext = builder.context;
         this.view = LayoutInflater.from(builder.context).inflate(R.layout.material_dialog, null);
         this.view = LayoutInflater.from(builder.context).inflate(R.layout.material_dialog, null);
-        ((MeasureCallbackLinearLayout) view).setCallback(this);
         this.customView = builder.customView;
         this.customView = builder.customView;
         this.callback = builder.callback;
         this.callback = builder.callback;
         this.listCallback = builder.listCallback;
         this.listCallback = builder.listCallback;
@@ -83,14 +81,14 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
         this.neutralColor = builder.neutralColor;
         this.neutralColor = builder.neutralColor;
         this.items = builder.items;
         this.items = builder.items;
         this.setCancelable(builder.cancelable);
         this.setCancelable(builder.cancelable);
-        this.regularFont = Typeface.createFromAsset(getContext().getResources().getAssets(), "Roboto-Regular.ttf");
+        final Typeface regularFont = Typeface.createFromAsset(getContext().getResources().getAssets(), "Roboto-Regular.ttf");
         this.mediumFont = Typeface.createFromAsset(getContext().getResources().getAssets(), "Roboto-Medium.ttf");
         this.mediumFont = Typeface.createFromAsset(getContext().getResources().getAssets(), "Roboto-Medium.ttf");
         this.selectedIndex = builder.selectedIndex;
         this.selectedIndex = builder.selectedIndex;
         this.selectedIndices = builder.selectedIndicies;
         this.selectedIndices = builder.selectedIndicies;
         this.mItemProcessor = builder.itemProcessor;
         this.mItemProcessor = builder.itemProcessor;
 
 
         TextView title = (TextView) view.findViewById(R.id.title);
         TextView title = (TextView) view.findViewById(R.id.title);
-        TextView content = (TextView) view.findViewById(R.id.content);
+        final TextView content = (TextView) view.findViewById(R.id.content);
 
 
         content.setText(builder.content);
         content.setText(builder.content);
         content.setMovementMethod(new LinkMovementMethod());
         content.setMovementMethod(new LinkMovementMethod());
@@ -151,6 +149,7 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
 
 
         invalidateList();
         invalidateList();
         invalidateActions();
         invalidateActions();
+        checkIfStackingNeeded();
         setViewInternal(view);
         setViewInternal(view);
     }
     }
 
 
@@ -189,7 +188,7 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
      */
      */
     private void invalidateSingleChoice(int newSelection) {
     private void invalidateSingleChoice(int newSelection) {
         newSelection++;
         newSelection++;
-        LinearLayout list = (LinearLayout) view.findViewById(R.id.customViewFrame);
+        final LinearLayout list = (LinearLayout) view.findViewById(R.id.customViewFrame);
         for (int i = 1; i < list.getChildCount(); i++) {
         for (int i = 1; i < list.getChildCount(); i++) {
             View v = list.getChildAt(i);
             View v = list.getChildAt(i);
             @SuppressLint("WrongViewCast")
             @SuppressLint("WrongViewCast")
@@ -254,9 +253,10 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
      * From: http://www.google.com/design/spec/components/dialogs.html#dialogs-specs
      * From: http://www.google.com/design/spec/components/dialogs.html#dialogs-specs
      */
      */
     private int calculateMaxButtonWidth() {
     private int calculateMaxButtonWidth() {
+        final int dialogWidthDp = (int) mContext.getResources().getDimension(R.dimen.dialog_width);
         final int eightDp = (int) mContext.getResources().getDimension(R.dimen.button_padding_horizontal_external);
         final int eightDp = (int) mContext.getResources().getDimension(R.dimen.button_padding_horizontal_external);
         final int sixteenDp = (int) mContext.getResources().getDimension(R.dimen.button_padding_frame_side);
         final int sixteenDp = (int) mContext.getResources().getDimension(R.dimen.button_padding_frame_side);
-        return (view.getMeasuredWidth() - sixteenDp - sixteenDp - eightDp) / 2;
+        return (dialogWidthDp - sixteenDp - sixteenDp - eightDp) / 2;
     }
     }
 
 
     /**
     /**
@@ -278,16 +278,20 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
             return;
             return;
         }
         }
         final int maxWidth = calculateMaxButtonWidth();
         final int maxWidth = calculateMaxButtonWidth();
+        Log.v("StackingAlgorithm", "Max button width: " + maxWidth);
         final Paint paint = positiveButton.getPaint();
         final Paint paint = positiveButton.getPaint();
         final int eightDp = (int) mContext.getResources().getDimension(R.dimen.button_padding_horizontal_external);
         final int eightDp = (int) mContext.getResources().getDimension(R.dimen.button_padding_horizontal_external);
         final int positiveWidth = (int) paint.measureText(positiveButton.getText().toString()) + (eightDp * 2);
         final int positiveWidth = (int) paint.measureText(positiveButton.getText().toString()) + (eightDp * 2);
+        Log.v("StackingAlgorithm", "Positive button width: " + positiveWidth);
         isStacked = positiveWidth > maxWidth;
         isStacked = positiveWidth > maxWidth;
         if (!isStacked && this.neutralText != null) {
         if (!isStacked && this.neutralText != null) {
             final int neutralWidth = (int) paint.measureText(neutralButton.getText().toString()) + (eightDp * 2);
             final int neutralWidth = (int) paint.measureText(neutralButton.getText().toString()) + (eightDp * 2);
+            Log.v("StackingAlgorithm", "Neutral button width: " + neutralWidth);
             isStacked = neutralWidth > maxWidth;
             isStacked = neutralWidth > maxWidth;
         }
         }
         if (!isStacked && this.negativeText != null) {
         if (!isStacked && this.negativeText != null) {
             final int negativeWidth = (int) paint.measureText(negativeButton.getText().toString()) + (eightDp * 2);
             final int negativeWidth = (int) paint.measureText(negativeButton.getText().toString()) + (eightDp * 2);
+            Log.v("StackingAlgorithm", "Negative button width: " + negativeWidth);
             isStacked = negativeWidth > maxWidth;
             isStacked = negativeWidth > maxWidth;
         }
         }
         invalidateActions();
         invalidateActions();
@@ -413,11 +417,6 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
         }
         }
     }
     }
 
 
-    @Override
-    public void onMeasureLinear(LinearLayout view) {
-        checkIfStackingNeeded();
-    }
-
     @Override
     @Override
     public void onMeasureScroll(ScrollView view) {
     public void onMeasureScroll(ScrollView view) {
         if (view.getMeasuredWidth() > 0) {
         if (view.getMeasuredWidth() > 0) {

+ 0 - 40
library/src/main/java/com/afollestad/materialdialogs/views/MeasureCallbackLinearLayout.java

@@ -1,40 +0,0 @@
-package com.afollestad.materialdialogs.views;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.LinearLayout;
-
-/**
- * @author Aidan Follestad (afollestad)
- */
-public class MeasureCallbackLinearLayout extends LinearLayout {
-
-    public MeasureCallbackLinearLayout(Context context) {
-        super(context);
-    }
-
-    public MeasureCallbackLinearLayout(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public MeasureCallbackLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-    }
-
-    public static interface Callback {
-        void onMeasureLinear(LinearLayout view);
-    }
-
-    private Callback mCallback;
-
-    public void setCallback(Callback mCallback) {
-        this.mCallback = mCallback;
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-        if (mCallback != null)
-            mCallback.onMeasureLinear(this);
-    }
-}

+ 2 - 2
library/src/main/res/layout/material_dialog.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
-<com.afollestad.materialdialogs.views.MeasureCallbackLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     xmlns:tools="http://schemas.android.com/tools"
     android:orientation="vertical"
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_width="match_parent"
@@ -120,4 +120,4 @@
 
 
     </LinearLayout>
     </LinearLayout>
 
 
-</com.afollestad.materialdialogs.views.MeasureCallbackLinearLayout>
+</LinearLayout>

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

@@ -22,5 +22,6 @@
     <dimen name="listitem_textsize">16sp</dimen>
     <dimen name="listitem_textsize">16sp</dimen>
     <dimen name="listitem_height">48dp</dimen>
     <dimen name="listitem_height">48dp</dimen>
     <dimen name="listitem_control_margin">16dp</dimen>
     <dimen name="listitem_control_margin">16dp</dimen>
+    <dimen name="dialog_width">280dp</dimen>
 
 
 </resources>
 </resources>