com.actionbarsherlock.internal.widget.TabsLinearLayout Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sample Show documentation
Show all versions of sample Show documentation
Android library for better number/date/time-picker DialogFragments.
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());
}
}