diff options
author | Alan Viverette <alanv@google.com> | 2015-05-27 17:30:44 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-05-27 17:30:45 +0000 |
commit | 165229ba417fd77ccbb4feb3bc3c664d2cac7ce5 (patch) | |
tree | 8b7bee6fb1ce97e189ee985037c40ecf5d584548 | |
parent | 07491cb93c66c0f4a1680dc07eca22dab5455c12 (diff) | |
parent | cffaf7e7e4d77fc7f8136051c548f9e0e7318101 (diff) | |
download | frameworks_base-165229ba417fd77ccbb4feb3bc3c664d2cac7ce5.zip frameworks_base-165229ba417fd77ccbb4feb3bc3c664d2cac7ce5.tar.gz frameworks_base-165229ba417fd77ccbb4feb3bc3c664d2cac7ce5.tar.bz2 |
Merge "Add workaround for measuring stacked button bar layout" into mnc-dev
-rw-r--r-- | core/java/com/android/internal/widget/ButtonBarLayout.java | 39 | ||||
-rw-r--r-- | core/res/res/values/styles_material.xml | 2 |
2 files changed, 28 insertions, 13 deletions
diff --git a/core/java/com/android/internal/widget/ButtonBarLayout.java b/core/java/com/android/internal/widget/ButtonBarLayout.java index f58ab03..39613e8 100644 --- a/core/java/com/android/internal/widget/ButtonBarLayout.java +++ b/core/java/com/android/internal/widget/ButtonBarLayout.java @@ -33,9 +33,6 @@ public class ButtonBarLayout extends LinearLayout { /** Whether the current configuration allows stacking. */ private final boolean mAllowStacking; - /** Whether the layout is currently stacked. */ - private boolean mStacked; - private int mLastWidthSize = -1; public ButtonBarLayout(Context context, AttributeSet attrs) { @@ -44,15 +41,14 @@ public class ButtonBarLayout extends LinearLayout { final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ButtonBarLayout); mAllowStacking = ta.getBoolean(R.styleable.ButtonBarLayout_allowStacking, false); ta.recycle(); - - mStacked = getOrientation() == VERTICAL; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final int widthSize = MeasureSpec.getSize(widthMeasureSpec); + if (mAllowStacking) { - final int widthSize = MeasureSpec.getSize(widthMeasureSpec); - if (widthSize > mLastWidthSize && mStacked) { + if (widthSize > mLastWidthSize && isStacked()) { // We're being measured wider this time, try un-stacking. setStacked(false); } @@ -60,18 +56,37 @@ public class ButtonBarLayout extends LinearLayout { mLastWidthSize = widthSize; } - super.onMeasure(widthMeasureSpec, heightMeasureSpec); + boolean needsRemeasure = false; + + // If we're not stacked, make sure the measure spec is AT_MOST rather + // than EXACTLY. This ensures that we'll still get TOO_SMALL so that we + // know to stack the buttons. + final int initialWidthMeasureSpec; + if (!isStacked() && MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY) { + initialWidthMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.AT_MOST); + + // We'll need to remeasure again to fill excess space. + needsRemeasure = true; + } else { + initialWidthMeasureSpec = widthMeasureSpec; + } + + super.onMeasure(initialWidthMeasureSpec, heightMeasureSpec); - if (mAllowStacking && !mStacked) { + if (mAllowStacking && !isStacked()) { final int measuredWidth = getMeasuredWidthAndState(); final int measuredWidthState = measuredWidth & MEASURED_STATE_MASK; if (measuredWidthState == MEASURED_STATE_TOO_SMALL) { setStacked(true); // Measure again in the new orientation. - super.onMeasure(widthMeasureSpec, heightMeasureSpec); + needsRemeasure = true; } } + + if (needsRemeasure) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } } private void setStacked(boolean stacked) { @@ -89,7 +104,9 @@ public class ButtonBarLayout extends LinearLayout { for (int i = childCount - 2; i >= 0; i--) { bringChildToFront(getChildAt(i)); } + } - mStacked = stacked; + private boolean isStacked() { + return getOrientation() == LinearLayout.VERTICAL; } } diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml index 165d1f8..56eafe1 100644 --- a/core/res/res/values/styles_material.xml +++ b/core/res/res/values/styles_material.xml @@ -489,8 +489,6 @@ please see styles_device_defaults.xml. <!-- Alert dialog button bar button --> <style name="Widget.Material.Button.ButtonBar.AlertDialog" parent="Widget.Material.Button.Borderless.Colored"> <item name="minWidth">64dp</item> - <item name="singleLine">true</item> - <item name="ellipsize">none</item> <item name="minHeight">@dimen/alert_dialog_button_bar_height</item> </style> |