package com.actionbarsherlock.internal.widget; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; import android.widget.LinearLayout; public class TabsLinearLayout extends IcsLinearLayout { private static final int[] R_styleable_LinearLayout = new int[] { /* 0 */ android.R.attr.measureWithLargestChild, }; private static final int LinearLayout_measureWithLargestChild = 0; private boolean mUseLargestChild; public TabsLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, /*com.android.internal.R.styleable.*/R_styleable_LinearLayout); mUseLargestChild = a.getBoolean(/*com.android.internal.R.styleable.*/LinearLayout_measureWithLargestChild, false); a.recycle(); } /** * When true, all children with a weight will be considered having * the minimum size of the largest child. If false, all children are * measured normally. * * @return True to measure children with a weight using the minimum * size of the largest child, false otherwise. * * @attr ref android.R.styleable#LinearLayout_measureWithLargestChild */ public boolean isMeasureWithLargestChildEnabled() { return mUseLargestChild; } /** * When set to true, all children with a weight will be considered having * the minimum size of the largest child. If false, all children are * measured normally. * * Disabled by default. * * @param enabled True to measure children with a weight using the * minimum size of the largest child, false otherwise. * * @attr ref android.R.styleable#LinearLayout_measureWithLargestChild */ public void setMeasureWithLargestChildEnabled(boolean enabled) { mUseLargestChild = enabled; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int childCount = getChildCount(); if (childCount <= 2) return; final int mode = MeasureSpec.getMode(widthMeasureSpec); if (mUseLargestChild && mode == MeasureSpec.UNSPECIFIED) { final int orientation = getOrientation(); if (orientation == HORIZONTAL) { useLargestChildHorizontal(); } } } private void useLargestChildHorizontal() { final int childCount = getChildCount(); // Find largest child width int largestChildWidth = 0; for (int i = 0; i < childCount; i++) { final View child = getChildAt(i); largestChildWidth = Math.max(child.getMeasuredWidth(), largestChildWidth); } int totalWidth = 0; // Re-measure childs for (int i = 0; i < childCount; i++) { final View child = getChildAt(i); if (child == null || child.getVisibility() == View.GONE) { continue; } final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams(); float childExtra = lp.weight; if (childExtra > 0) { child.measure( MeasureSpec.makeMeasureSpec(largestChildWidth, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(child.getMeasuredHeight(), MeasureSpec.EXACTLY)); totalWidth += largestChildWidth; } else { totalWidth += child.getMeasuredWidth(); } totalWidth += lp.leftMargin + lp.rightMargin; } totalWidth += getPaddingLeft() + getPaddingRight(); setMeasuredDimension(totalWidth, getMeasuredHeight()); } }