summaryrefslogtreecommitdiff
path: root/core/java/android/widget/FrameLayout.java
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2011-01-04 17:39:43 -0800
committerRomain Guy <romainguy@google.com>2011-01-04 17:39:43 -0800
commit9c9573721140c260d4614c7ac58923dcfa0cea22 (patch)
tree2aa2592f08b86df00a95a6c4e37c34fa5e163130 /core/java/android/widget/FrameLayout.java
parent6b5108bc9ce6401174fb1abf6791222f3e0353c4 (diff)
Make FrameLayout support mixed wrap_content/match_parent children.
Bug #3259668 If a FrameLayout is measured with an UNSPECIFIED or AT_MOST spec, it cannot correctly define the size of its children set to match_parent. This change adds a second measurement pass similar to what LinearLayout does in the same situation. Change-Id: I20ac5203c2efc2e559f88b2c9573d4ad7df488b4
Diffstat (limited to 'core/java/android/widget/FrameLayout.java')
-rw-r--r--core/java/android/widget/FrameLayout.java62
1 files changed, 55 insertions, 7 deletions
diff --git a/core/java/android/widget/FrameLayout.java b/core/java/android/widget/FrameLayout.java
index 26e191dbf768..7bae3608f1c3 100644
--- a/core/java/android/widget/FrameLayout.java
+++ b/core/java/android/widget/FrameLayout.java
@@ -29,6 +29,8 @@ import android.view.ViewGroup;
import android.view.Gravity;
import android.widget.RemoteViews.RemoteView;
+import java.util.ArrayList;
+
/**
* FrameLayout is designed to block out an area on the screen to display
@@ -46,6 +48,8 @@ import android.widget.RemoteViews.RemoteView;
*/
@RemoteView
public class FrameLayout extends ViewGroup {
+ private static final int DEFAULT_CHILD_GRAVITY = Gravity.TOP | Gravity.LEFT;
+
@ViewDebug.ExportedProperty(category = "measurement")
boolean mMeasureAllChildren = false;
@@ -76,8 +80,8 @@ public class FrameLayout extends ViewGroup {
boolean mForegroundBoundsChanged = false;
- private static final int DEFAULT_CHILD_GRAVITY = Gravity.TOP | Gravity.LEFT;
-
+ private final ArrayList<View> mMatchParentChildren = new ArrayList<View>(1);
+
public FrameLayout(Context context) {
super(context);
}
@@ -246,13 +250,17 @@ public class FrameLayout extends ViewGroup {
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- final int count = getChildCount();
+ int count = getChildCount();
+
+ final boolean measureMatchParentChildren =
+ MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY ||
+ MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY;
+ mMatchParentChildren.clear();
int maxHeight = 0;
int maxWidth = 0;
int childState = 0;
- // Find rightmost and bottommost child
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (mMeasureAllChildren || child.getVisibility() != GONE) {
@@ -260,6 +268,13 @@ public class FrameLayout extends ViewGroup {
maxWidth = Math.max(maxWidth, child.getMeasuredWidth());
maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
childState = combineMeasuredStates(childState, child.getMeasuredState());
+ if (measureMatchParentChildren) {
+ final ViewGroup.LayoutParams lp = child.getLayoutParams();
+ if (lp.width == LayoutParams.MATCH_PARENT ||
+ lp.height == LayoutParams.MATCH_PARENT) {
+ mMatchParentChildren.add(child);
+ }
+ }
}
}
@@ -280,7 +295,40 @@ public class FrameLayout extends ViewGroup {
setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
resolveSizeAndState(maxHeight, heightMeasureSpec,
- childState<<MEASURED_HEIGHT_STATE_SHIFT));
+ childState << MEASURED_HEIGHT_STATE_SHIFT));
+
+ if (mMatchParentChildren.size() > 0) {
+ count = mMatchParentChildren.size();
+ for (int i = 0; i < count; i++) {
+ final View child = mMatchParentChildren.get(i);
+
+ final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
+ int childWidthMeasureSpec;
+ int childHeightMeasureSpec;
+
+ if (lp.width == LayoutParams.MATCH_PARENT) {
+ childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth() -
+ mPaddingLeft - mPaddingRight - lp.leftMargin - lp.rightMargin,
+ MeasureSpec.EXACTLY);
+ } else {
+ childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec,
+ mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin,
+ lp.width);
+ }
+
+ if (lp.height == LayoutParams.MATCH_PARENT) {
+ childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight() -
+ mPaddingTop - mPaddingBottom - lp.topMargin - lp.bottomMargin,
+ MeasureSpec.EXACTLY);
+ } else {
+ childHeightMeasureSpec = getChildMeasureSpec(widthMeasureSpec,
+ mPaddingTop + mPaddingBottom + lp.topMargin + lp.bottomMargin,
+ lp.height);
+ }
+
+ child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+ }
+ }
}
/**
@@ -306,8 +354,8 @@ public class FrameLayout extends ViewGroup {
final int width = child.getMeasuredWidth();
final int height = child.getMeasuredHeight();
- int childLeft = parentLeft;
- int childTop = parentTop;
+ int childLeft;
+ int childTop;
int gravity = lp.gravity;
if (gravity == -1) {