TableRow.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseIntArray; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewDebug; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A layout that arranges its children horizontally. A TableRow should 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * always be used as a child of a {@link android.widget.TableLayout}. If a 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TableRow's parent is not a TableLayout, the TableRow will behave as 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an horizontal {@link android.widget.LinearLayout}.</p> 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The children of a TableRow do not need to specify the 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>layout_width</code> and <code>layout_height</code> attributes in the 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * XML file. TableRow always enforces those values to be respectively 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.TableLayout.LayoutParams#FILL_PARENT} and 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.TableLayout.LayoutParams#WRAP_CONTENT}.</p> 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Also see {@link TableRow.LayoutParams android.widget.TableRow.LayoutParams} 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for layout attributes </p> 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class TableRow extends LinearLayout { 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNumColumns = 0; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] mColumnWidths; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] mConstrainedColumnWidths; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SparseIntArray mColumnToChildIndex; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ChildrenTracker mChildrenTracker; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Creates a new TableRow for the given context.</p> 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context the application environment 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public TableRow(Context context) { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initTableRow(); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Creates a new TableRow for the given context and with the 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified set attributes.</p> 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context the application environment 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param attrs a collection of attributes 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public TableRow(Context context, AttributeSet attrs) { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initTableRow(); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void initTableRow() { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OnHierarchyChangeListener oldListener = mOnHierarchyChangeListener; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenTracker = new ChildrenTracker(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldListener != null) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenTracker.setOnHierarchyChangeListener(oldListener); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setOnHierarchyChangeListener(mChildrenTracker); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnHierarchyChangeListener(OnHierarchyChangeListener listener) { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenTracker.setOnHierarchyChangeListener(listener); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Collapses or restores a given column.</p> 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param columnIndex the index of the column 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param collapsed true if the column must be collapsed, false otherwise 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setColumnCollapsed(int columnIndex, boolean collapsed) { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View child = getVirtualChildAt(columnIndex); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child != null) { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.setVisibility(collapsed ? GONE : VISIBLE); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // enforce horizontal layout 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project measureHorizontal(widthMeasureSpec, heightMeasureSpec); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onLayout(boolean changed, int l, int t, int r, int b) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // enforce horizontal layout 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project layoutHorizontal(); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getVirtualChildAt(int i) { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mColumnToChildIndex == null) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mapIndexAndColumns(); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int deflectedIndex = mColumnToChildIndex.get(i, -1); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (deflectedIndex != -1) { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getChildAt(deflectedIndex); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getVirtualChildCount() { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mColumnToChildIndex == null) { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mapIndexAndColumns(); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNumColumns; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void mapIndexAndColumns() { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mColumnToChildIndex == null) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int virtualCount = 0; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = getChildCount(); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mColumnToChildIndex = new SparseIntArray(); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final SparseIntArray columnToChild = mColumnToChildIndex; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = getChildAt(i); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final LayoutParams layoutParams = (LayoutParams) child.getLayoutParams(); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (layoutParams.column >= virtualCount) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtualCount = layoutParams.column; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0; j < layoutParams.span; j++) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columnToChild.put(virtualCount++, i); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumColumns = virtualCount; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int measureNullChild(int childIndex) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstrainedColumnWidths[childIndex]; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void measureChildBeforeLayout(View child, int childIndex, 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int widthMeasureSpec, int totalWidth, 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int heightMeasureSpec, int totalHeight) { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mConstrainedColumnWidths != null) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int measureMode = MeasureSpec.EXACTLY; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int columnWidth = 0; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int span = lp.span; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] constrainedColumnWidths = mConstrainedColumnWidths; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < span; i++) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columnWidth += constrainedColumnWidths[childIndex + i]; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int gravity = lp.gravity; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean isHorizontalGravity = Gravity.isHorizontal(gravity); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isHorizontalGravity) { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project measureMode = MeasureSpec.AT_MOST; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no need to care about padding here, 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ViewGroup.getChildMeasureSpec() would get rid of it anyway 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // because of the EXACTLY measure spec we use 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec( 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Math.max(0, columnWidth - lp.leftMargin - lp.rightMargin), measureMode 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec, 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPaddingTop + mPaddingBottom + lp.topMargin + 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp .bottomMargin + totalHeight, lp.height); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isHorizontalGravity) { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int childWidth = child.getMeasuredWidth(); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.mOffset[LayoutParams.LOCATION_NEXT] = columnWidth - childWidth; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Gravity.LEFT: 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // don't offset on X axis 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Gravity.RIGHT: 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.mOffset[LayoutParams.LOCATION] = lp.mOffset[LayoutParams.LOCATION_NEXT]; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Gravity.CENTER_HORIZONTAL: 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.mOffset[LayoutParams.LOCATION] = lp.mOffset[LayoutParams.LOCATION_NEXT] / 2; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.mOffset[LayoutParams.LOCATION] = lp.mOffset[LayoutParams.LOCATION_NEXT] = 0; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // fail silently when column widths are not available 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.measureChildBeforeLayout(child, childIndex, widthMeasureSpec, 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalWidth, heightMeasureSpec, totalHeight); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getChildrenSkipCount(View child, int index) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutParams layoutParams = (LayoutParams) child.getLayoutParams(); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when the span is 1 (default), we need to skip 0 child 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return layoutParams.span - 1; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getLocationOffset(View child) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((TableRow.LayoutParams) child.getLayoutParams()).mOffset[LayoutParams.LOCATION]; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getNextLocationOffset(View child) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((TableRow.LayoutParams) child.getLayoutParams()).mOffset[LayoutParams.LOCATION_NEXT]; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Measures the preferred width of each child, including its margins.</p> 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param widthMeasureSpec the width constraint imposed by our parent 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return an array of integers corresponding to the width of each cell, or 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * column, in this row 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] getColumnsWidths(int widthMeasureSpec) { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int numColumns = getVirtualChildCount(); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mColumnWidths == null || numColumns != mColumnWidths.length) { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mColumnWidths = new int[numColumns]; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] columnWidths = mColumnWidths; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numColumns; i++) { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = getVirtualChildAt(i); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child != null && child.getVisibility() != GONE) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final LayoutParams layoutParams = (LayoutParams) child.getLayoutParams(); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (layoutParams.span == 1) { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int spec; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (layoutParams.width) { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LayoutParams.WRAP_CONTENT: 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project spec = getChildMeasureSpec(widthMeasureSpec, 0, LayoutParams.WRAP_CONTENT); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LayoutParams.FILL_PARENT: 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project spec = MeasureSpec.makeMeasureSpec(layoutParams.width, MeasureSpec.EXACTLY); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.measure(spec, spec); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int width = child.getMeasuredWidth() + layoutParams.leftMargin + 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project layoutParams.rightMargin; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columnWidths[i] = width; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columnWidths[i] = 0; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columnWidths[i] = 0; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return columnWidths; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the width of all of the columns in this row. At layout time, 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this row sets a fixed width, as defined by <code>columnWidths</code>, 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on each child (or cell, or column.)</p> 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param columnWidths the fixed width of each column that this row must 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * honor 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IllegalArgumentException when columnWidths' length is smaller 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * than the number of children in this row 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setColumnsWidthConstraints(int[] columnWidths) { 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (columnWidths == null || columnWidths.length < getVirtualChildCount()) { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException( 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "columnWidths should be >= getVirtualChildCount()"); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstrainedColumnWidths = columnWidths; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams generateLayoutParams(AttributeSet attrs) { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new TableRow.LayoutParams(getContext(), attrs); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a set of layout parameters with a width of 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup.LayoutParams#FILL_PARENT}, 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a height of {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} and no spanning. 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected LinearLayout.LayoutParams generateDefaultLayoutParams() { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new LayoutParams(); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p instanceof TableRow.LayoutParams; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected LinearLayout.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new LayoutParams(p); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Set of layout parameters used in table rows.</p> 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.TableLayout.LayoutParams 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#TableRow_Cell_layout_column 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#TableRow_Cell_layout_span 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class LayoutParams extends LinearLayout.LayoutParams { 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The column index of the cell represented by the widget.</p> 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @ViewDebug.ExportedProperty 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int column; 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The number of columns the widgets spans over.</p> 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @ViewDebug.ExportedProperty 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int span; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int LOCATION = 0; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int LOCATION_NEXT = 1; 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] mOffset = new int[2]; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(Context c, AttributeSet attrs) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(c, attrs); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.obtainStyledAttributes(attrs, 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.TableRow_Cell); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project column = a.getInt(com.android.internal.R.styleable.TableRow_Cell_layout_column, -1); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project span = a.getInt(com.android.internal.R.styleable.TableRow_Cell_layout_span, 1); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (span <= 1) { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project span = 1; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the child width and the child height.</p> 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param w the desired width 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param h the desired height 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(int w, int h) { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(w, h); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project column = -1; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project span = 1; 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the child width, height and weight.</p> 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param w the desired width 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param h the desired height 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param initWeight the desired weight 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(int w, int h, float initWeight) { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(w, h, initWeight); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project column = -1; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project span = 1; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the child width to {@link android.view.ViewGroup.LayoutParams} 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the child height to 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT}.</p> 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams() { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(FILL_PARENT, WRAP_CONTENT); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project column = -1; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project span = 1; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Puts the view in the specified column.</p> 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the child width to {@link android.view.ViewGroup.LayoutParams#FILL_PARENT} 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the child height to 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT}.</p> 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param column the column index for the view 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(int column) { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.column = column; 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(ViewGroup.LayoutParams p) { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(p); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(MarginLayoutParams source) { 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(source); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void setBaseAttributes(TypedArray a, int widthAttr, int heightAttr) { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We don't want to force users to specify a layout_width 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a.hasValue(widthAttr)) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project width = a.getLayoutDimension(widthAttr, "layout_width"); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project width = FILL_PARENT; 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We don't want to force users to specify a layout_height 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a.hasValue(heightAttr)) { 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project height = a.getLayoutDimension(heightAttr, "layout_height"); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project height = WRAP_CONTENT; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // special transparent hierarchy change listener 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ChildrenTracker implements OnHierarchyChangeListener { 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnHierarchyChangeListener listener; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setOnHierarchyChangeListener(OnHierarchyChangeListener listener) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.listener = listener; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onChildViewAdded(View parent, View child) { 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // dirties the index to column map 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mColumnToChildIndex = null; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.listener != null) { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.listener.onChildViewAdded(parent, child); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onChildViewRemoved(View parent, View child) { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // dirties the index to column map 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mColumnToChildIndex = null; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.listener != null) { 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.listener.onChildViewRemoved(parent, child); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 532