summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/widget/RelativeLayout.java27
1 files changed, 19 insertions, 8 deletions
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index 70ef10b62b2e..bebe67f3b765 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -741,18 +741,29 @@ public class RelativeLayout extends ViewGroup {
private int getChildMeasureSpec(int childStart, int childEnd,
int childSize, int startMargin, int endMargin, int startPadding,
int endPadding, int mySize) {
+ 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) {
- return MeasureSpec.makeMeasureSpec(childSize, MeasureSpec.EXACTLY);
+ // 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;
}
- // 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;
+ return MeasureSpec.makeMeasureSpec(childSpecSize, childSpecMode);
+ }
// Figure out start and end bounds.
int tempStart = childStart;