如何知道小部件宽度是否设置为wrap_content

时间:2017-02-26 09:26:52

标签: android view android-linearlayout

我正在创建一个扩展LinearLayout的自定义视图。我正在为线性布局添加一些形状,目前它们之间具有固定的空间值。我这样做是通过定义LayoutParams并设置边距来创建形状之间的空间。

我想要做的是将它们跨越整个屏幕的相等空间,以便填充它,但前提是视图的宽度设置为match_parentfill_parent。如果设置为wrap_content,则应设置原始的固定空间值。

我尝试过:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
   super.onMeasure(widthMeasureSpec, heightMeasureSpec);
   int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
   spaceBetweenShapesPixels = (parentWidth - shapeWidth * numberOfShapes) / numberOfShapess;
}

但是,该方法似乎被调用了两次 - 一次是父级的宽度和高度,一次是View的本身,一次是视图本身,空间得到0值。

那我怎么才能做出这样的逻辑:

if(width is wrap_content)
{
   space = 10;
}
else
{
   space = (parentWidth - shapeWidth * numberOfShapes) / numberOfShapess;
}

1 个答案:

答案 0 :(得分:0)

您应该使用WidthModeHeightModeonMeasure()方法中。以下是我的一个项目的样本

@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int measuredWidth = 0, measuredHeight = 0;

if (widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST) {
  measuredWidth = MeasureSpec.getSize(widthMeasureSpec);
}

if (heightMode == MeasureSpec.EXACTLY) {
  measuredHeight = MeasureSpec.getSize(heightMeasureSpec);
} else if (heightMode == MeasureSpec.AT_MOST) {
  double height = MeasureSpec.getSize(heightMeasureSpec) * 0.8;
  measuredHeight = (int) height;// + paddingTop + paddingBottom;
}
}

MeasureSpec.EXACTLY - 视图应该是这么多像素,无论它实际上有多大。

MeasureSpec.AT_MOST - 如果视图的尺寸较小,则视图可以是此尺寸或更小。

MeasureSpec.UNSPECIFIED - 视图可以是它需要的任何大小,以显示它需要显示的内容。

有关详细信息https://stackoverflow.com/a/16022982/2809326

,请参阅此处