From 517a00460365a5f9d4616f1216f13bc74974c488 Mon Sep 17 00:00:00 2001 From: Alan Viverette Date: Wed, 4 Dec 2013 17:08:44 -0800 Subject: [PATCH] Fix handling of constraints for unspecified height RelativeLayouts BUG: 11897546 Change-Id: If26c4be3763072f53f889574a51af16bbd6532c7 --- core/java/android/widget/RelativeLayout.java | 31 +++++++++++++------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index 70ef10b62b2ea..bebe67f3b765f 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -741,19 +741,30 @@ public class RelativeLayout extends ViewGroup { private int getChildMeasureSpec(int childStart, int childEnd, int childSize, int startMargin, int endMargin, int startPadding, int endPadding, int mySize) { - if (mySize < 0 && !mAllowBrokenMeasureSpecs) { - if (childSize >= 0) { - return MeasureSpec.makeMeasureSpec(childSize, MeasureSpec.EXACTLY); - } - // Negative values in a mySize/myWidth/myWidth value in RelativeLayout measurement - // is code for, "we got an unspecified mode in the RelativeLayout's measurespec." - // Carry it forward. - return MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); - } - int childSpecMode = 0; int childSpecSize = 0; + // Negative values in a mySize/myWidth/myWidth value in RelativeLayout + // measurement is code for, "we got an unspecified mode in the + // RelativeLayout's measure spec." + if (mySize < 0 && !mAllowBrokenMeasureSpecs) { + if (childSize >= 0) { + // The child specified an exact size. + childSpecSize = childSize; + childSpecMode = MeasureSpec.EXACTLY; + } else if (childStart >= 0 && childEnd >= 0) { + // Constraints fixed both edges, so child has an exact size. + childSpecSize = Math.max(0, childEnd - childStart); + childSpecMode = MeasureSpec.EXACTLY; + } else { + // Allow the child to be whatever size it wants. + childSpecSize = 0; + childSpecMode = MeasureSpec.UNSPECIFIED; + } + + return MeasureSpec.makeMeasureSpec(childSpecSize, childSpecMode); + } + // Figure out start and end bounds. int tempStart = childStart; int tempEnd = childEnd;