我正在尝试创建一个自定义LinearLayout
,其中高度为宽度的80%。
我创建了一个扩展LinearLayout并覆盖onMeasure()
的类。我以为我可以操纵传入的widthMeasureSpec和heightMeasureSpec,但我得到的只是一个没有高度的LinearLayout。
实际上,我有一个TextView,所以我看到的是没有应用于布局的其他高度的TextView。
我希望有人可以告诉我这有什么问题:
public class CustomLinearLayout extends LinearLayout {
public CustomLinearLayout(Context context) {
super(context);
}
public CustomLinearLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int adjustedHeight = (int) (MeasureSpec.getSize(widthMeasureSpec) * 0.8);
int measureSpecMode = MeasureSpec.getMode(widthMeasureSpec);
int adjustedHeightMeasureSpec =
MeasureSpec.makeMeasureSpec(adjustedHeight, measureSpecMode);
super.onMeasure(widthMeasureSpec, adjustedHeightMeasureSpec);
}
}
编辑:好的,这很奇怪。在我重新启动Eclipse并再次运行它之后,代码决定工作。
答案 0 :(得分:1)
您应该准确地更改模式,例如:
int measureSpecMode = MeasureSpec.EXACTLY;
答案 1 :(得分:0)
一个问题可能是布局计算的高度是基于孩子的,即布局会越高,它就越多。
然而,您的代码的一个明显问题是您没有调用
setMeasuredDimension(widthMeasureSpec, adjustedHeightMeasureSpec);
onMeasure()
方法中的。你仍然有super.onMeasure。为了使用您自定义的测量高度和宽度,您必须调用此方法。实际上,您可以在onMeasure中删除代码的最后一行,并将其替换为上面的行。
答案 2 :(得分:0)
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, (int)(widthMeasureSpec*0.8));
}
答案 3 :(得分:0)
您可以使用此代码将布局高度调整为任何比例:
private static final float RATIO = 80f / 100f;
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
int width = getMeasuredWidth();
int height = getMeasuredHeight();
int widthWithoutPadding = width - getPaddingLeft() - getPaddingRight();
int heigthWithoutPadding = height - getPaddingTop() - getPaddingBottom();
int maxWidth = (int) (heigthWithoutPadding * RATIO);
int maxHeight = (int) (widthWithoutPadding / RATIO);
if (widthWithoutPadding > maxWidth) {
width = maxWidth + getPaddingLeft() + getPaddingRight();
} else {
height = maxHeight + getPaddingTop() + getPaddingBottom();
}
setMeasuredDimension(width, height);
super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
}
您可以根据需要改变RATIO
常数。