summaryrefslogtreecommitdiffstats
path: root/core/java/com
diff options
context:
space:
mode:
authorAlan Viverette <alanv@google.com>2015-05-27 10:28:05 -0700
committerAlan Viverette <alanv@google.com>2015-05-27 10:28:05 -0700
commitcffaf7e7e4d77fc7f8136051c548f9e0e7318101 (patch)
tree1c4f7f195891acfc952b91f4b46c08734a846a60 /core/java/com
parentbcbe9ba0f939803dfa9b48519e113dc1c32268dc (diff)
downloadframeworks_base-cffaf7e7e4d77fc7f8136051c548f9e0e7318101.zip
frameworks_base-cffaf7e7e4d77fc7f8136051c548f9e0e7318101.tar.gz
frameworks_base-cffaf7e7e4d77fc7f8136051c548f9e0e7318101.tar.bz2
Add workaround for measuring stacked button bar layout
Bug: 21300645 Change-Id: If9544da4995c3dce118dd9e36d42764662b3aecd
Diffstat (limited to 'core/java/com')
-rw-r--r--core/java/com/android/internal/widget/ButtonBarLayout.java39
1 files changed, 28 insertions, 11 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;
}
}