diff options
author | Romain Guy <romainguy@google.com> | 2013-04-08 10:51:35 -0700 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2013-04-08 12:56:15 -0700 |
commit | 76d59a3b7b3ceea1d0854e588532cfc91b44201d (patch) | |
tree | f87881e65884618aa9e16f1f4c3be5be946a9728 | |
parent | 50b9eb1c7375a87525d44a036337a8ba18eba55b (diff) | |
download | frameworks_base-76d59a3b7b3ceea1d0854e588532cfc91b44201d.zip frameworks_base-76d59a3b7b3ceea1d0854e588532cfc91b44201d.tar.gz frameworks_base-76d59a3b7b3ceea1d0854e588532cfc91b44201d.tar.bz2 |
Always take padding and margins into account
Bug #8565842
Change-Id: I8ee398b5c36b3011950265eb7e22cc8338f1aeee
-rw-r--r-- | core/java/android/widget/RelativeLayout.java | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index 529de2e..3df7258 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -220,28 +220,29 @@ public class RelativeLayout extends ViewGroup { // with MeasureSpec value overflow and RelativeLayout was one source of them. // Some apps came to rely on them. :( private boolean mAllowBrokenMeasureSpecs = false; + // Compatibility hack. Old versions of the platform would not take + // margins and padding into account when generating the height measure spec + // for children during the horizontal measure pass. + private boolean mMeasureVerticalWithPaddingMargin = false; // A default width used for RTL measure pass - private static int DEFAULT_WIDTH = Integer.MAX_VALUE / 2; + private static final int DEFAULT_WIDTH = Integer.MAX_VALUE / 2; public RelativeLayout(Context context) { super(context); - mAllowBrokenMeasureSpecs = context.getApplicationInfo().targetSdkVersion <= - Build.VERSION_CODES.JELLY_BEAN_MR1; + queryCompatibilityModes(context); } public RelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); initFromAttributes(context, attrs); - mAllowBrokenMeasureSpecs = context.getApplicationInfo().targetSdkVersion <= - Build.VERSION_CODES.JELLY_BEAN_MR1; + queryCompatibilityModes(context); } public RelativeLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initFromAttributes(context, attrs); - mAllowBrokenMeasureSpecs = context.getApplicationInfo().targetSdkVersion <= - Build.VERSION_CODES.JELLY_BEAN_MR1; + queryCompatibilityModes(context); } private void initFromAttributes(Context context, AttributeSet attrs) { @@ -251,6 +252,12 @@ public class RelativeLayout extends ViewGroup { a.recycle(); } + private void queryCompatibilityModes(Context context) { + int version = context.getApplicationInfo().targetSdkVersion; + mAllowBrokenMeasureSpecs = version <= Build.VERSION_CODES.JELLY_BEAN_MR1; + mMeasureVerticalWithPaddingMargin = version >= Build.VERSION_CODES.JELLY_BEAN_MR2; + } + @Override public boolean shouldDelayChildPressedState() { return false; @@ -692,6 +699,11 @@ public class RelativeLayout extends ViewGroup { params.leftMargin, params.rightMargin, mPaddingLeft, mPaddingRight, myWidth); + int maxHeight = myHeight; + if (mMeasureVerticalWithPaddingMargin) { + maxHeight = Math.max(0, myHeight - mPaddingTop - mPaddingBottom - + params.topMargin - params.bottomMargin); + } int childHeightMeasureSpec; if (myHeight < 0 && !mAllowBrokenMeasureSpecs) { if (params.height >= 0) { @@ -704,9 +716,9 @@ public class RelativeLayout extends ViewGroup { childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); } } else if (params.width == LayoutParams.MATCH_PARENT) { - childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(myHeight, MeasureSpec.EXACTLY); + childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.EXACTLY); } else { - childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(myHeight, MeasureSpec.AT_MOST); + childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST); } child.measure(childWidthMeasureSpec, childHeightMeasureSpec); } |