diff options
-rw-r--r-- | api/current.txt | 3 | ||||
-rw-r--r-- | core/java/android/widget/GridLayout.java | 81 | ||||
-rw-r--r-- | tests/GridLayoutTest/res/layout/grid7.xml | 68 |
3 files changed, 82 insertions, 70 deletions
diff --git a/api/current.txt b/api/current.txt index f170d78..b918149 100644 --- a/api/current.txt +++ b/api/current.txt @@ -24878,9 +24878,6 @@ package android.widget { } public static abstract class GridLayout.Alignment { - ctor public GridLayout.Alignment(); - method public abstract int getAlignmentValue(android.view.View, int, int); - method public int getSizeInCell(android.view.View, int, int, int); } public static class GridLayout.Group { diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java index e88d257..1570224 100644 --- a/core/java/android/widget/GridLayout.java +++ b/core/java/android/widget/GridLayout.java @@ -925,8 +925,8 @@ public class GridLayout extends ViewGroup { int mHeight = topMargin + pHeight + bottomMargin; // Alignment offsets: the location of the view relative to its alignment group. - int a2vx = colBounds.before - hAlign.getAlignmentValue(c, mWidth, type); - int a2vy = rowBounds.before - vAlign.getAlignmentValue(c, mHeight, type); + int a2vx = colBounds.getOffset(c, hAlign, type, mWidth); + int a2vy = rowBounds.getOffset(c, vAlign, type, mHeight); dx = c2ax + a2vx + leftMargin; dy = c2ay + a2vy + topMargin; @@ -935,8 +935,8 @@ public class GridLayout extends ViewGroup { cellHeight -= topMargin + bottomMargin; } else { // Alignment offsets: the location of the view relative to its alignment group. - int a2vx = colBounds.before - hAlign.getAlignmentValue(c, pWidth, type); - int a2vy = rowBounds.before - vAlign.getAlignmentValue(c, pHeight, type); + int a2vx = colBounds.getOffset(c, hAlign, type, pWidth); + int a2vy = rowBounds.getOffset(c, vAlign, type, pHeight); dx = c2ax + a2vx; dy = c2ay + a2vy; @@ -1048,7 +1048,7 @@ public class GridLayout extends ViewGroup { Group group = horizontal ? lp.columnGroup : lp.rowGroup; groups[i] = group; - bounds[i] = new Bounds(); + bounds[i] = group.alignment.getBounds(); } return new PackedMap<Group, Bounds>(groups, bounds); @@ -1994,20 +1994,24 @@ public class GridLayout extends ViewGroup { reset(); } - private void reset() { + protected void reset() { before = Integer.MIN_VALUE; after = Integer.MIN_VALUE; } - private void include(int before, int after) { + protected void include(int before, int after) { this.before = max(this.before, before); this.after = max(this.after, after); } - private int size() { + protected int size() { return before + after; } + protected int getOffset(View c, Alignment alignment, int type, int size) { + return before - alignment.getAlignmentValue(c, size, type); + } + @Override public String toString() { return "Bounds{" + @@ -2233,15 +2237,18 @@ public class GridLayout extends ViewGroup { * {@link Group#alignment alignment}. Overall placement of the view in the cell * group is specified by the two alignments which act along each axis independently. * <p> + * The GridLayout class defines the most common alignments used in general layout: + * {@link #TOP}, {@link #LEFT}, {@link #BOTTOM}, {@link #RIGHT}, {@link #CENTER}, {@link + * #BASELINE} and {@link #FILL}. + */ + /* * An Alignment implementation must define {@link #getAlignmentValue(View, int, int)}, * to return the appropriate value for the type of alignment being defined. * The enclosing algorithms position the children * so that the locations defined by the alignment values * are the same for all of the views in a group. * <p> - * The GridLayout class defines the most common alignments used in general layout: - * {@link #TOP}, {@link #LEFT}, {@link #BOTTOM}, {@link #RIGHT}, {@link #CENTER}, {@link - * #BASELINE} and {@link #FILL}. + */ public static abstract class Alignment { private static final Alignment GONE = new Alignment() { @@ -2251,6 +2258,9 @@ public class GridLayout extends ViewGroup { } }; + /*pp*/ Alignment() { + } + /** * Returns an alignment value. In the case of vertical alignments the value * returned should indicate the distance from the top of the view to the @@ -2264,7 +2274,7 @@ public class GridLayout extends ViewGroup { * * @return the alignment value */ - public abstract int getAlignmentValue(View view, int viewSize, int measurementType); + /*pp*/ abstract int getAlignmentValue(View view, int viewSize, int measurementType); /** * Returns the size of the view specified by this alignment. @@ -2281,9 +2291,13 @@ public class GridLayout extends ViewGroup { * * @return the aligned size */ - public int getSizeInCell(View view, int viewSize, int cellSize, int measurementType) { + /*pp*/ int getSizeInCell(View view, int viewSize, int cellSize, int measurementType) { return viewSize; } + + /*pp*/ Bounds getBounds() { + return new Bounds(); + } } private static final Alignment LEADING = new Alignment() { @@ -2347,11 +2361,42 @@ public class GridLayout extends ViewGroup { return UNDEFINED; } int baseline = view.getBaseline(); - if (baseline == -1) { - return UNDEFINED; - } else { - return baseline; - } + return (baseline == -1) ? UNDEFINED : baseline; + } + + @Override + public Bounds getBounds() { + return new Bounds() { + /* + In a baseline aligned row in which some components define a baseline + and some don't, we need a third variable to properly account for all + the sizes. This tracks the maximum size of all the components - + including those that don't define a baseline. + */ + private int size; + + @Override + protected void reset() { + super.reset(); + size = 0; + } + + @Override + protected void include(int before, int after) { + super.include(before, after); + size = max(size, before + after); + } + + @Override + protected int size() { + return max(super.size(), size); + } + + @Override + protected int getOffset(View c, Alignment alignment, int type, int size) { + return max(0, super.getOffset(c, alignment, type, size)); + } + }; } }; diff --git a/tests/GridLayoutTest/res/layout/grid7.xml b/tests/GridLayoutTest/res/layout/grid7.xml index b97a00b..b9e58d7 100644 --- a/tests/GridLayoutTest/res/layout/grid7.xml +++ b/tests/GridLayoutTest/res/layout/grid7.xml @@ -15,56 +15,26 @@ <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" - - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:orientation="horizontal" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingTop="10dip" > - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingRight="5dip" - android:text="flabe" /> - - <Button android:id="@+id/initialActivity" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="bax" /> - </LinearLayout> - - <LinearLayout - android:orientation="horizontal" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingTop="5dip" > - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingRight="5dip" - android:text="bar" /> - - <EditText android:id="@+id/numberOfEvents" - android:layout_marginLeft="2dip" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@android:drawable/editbox_background" - android:numeric="integer" - android:scrollHorizontally="true" - android:maxLines="1" /> - </LinearLayout> - - <Button android:id="@+id/start" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingTop="10dip" - android:text="Foo" /> + android:layout_height="match_parent"> + android:columnCount="2" + <Space + android:layout_row="0" + android:layout_column="0" + android:layout_width="109dip" + android:layout_height="108dip"/> + + <Button + android:text="Button 1" + android:layout_row="0" + android:layout_column="1" + /> + + <Button + android:text="Button 2" + android:layout_row="1" + android:layout_column="1" + /> </GridLayout> |