LayoutInflate 创建View的 LayoutParams问题

用View v = LayoutInflate.inflate(R.layout.id, null); 得到的v  调用v.getLayoutParams(), 得到的是null, 即使在布局中指定了大小。 因为该view没有附加到一个父view上去。

可用这个方法 View v = inflater.inflate(R.layout.hello_world, viewGroup, false);  最后一个参数为false说明不将创建的view添加到viewGroup中,而只是为了得到view的布局参数信息。

------------------------------------------------------------------------------------

在ListView中,会默认给v如下的AbsListView.LayoutParams,所以如果不在Adapter中指定itemView 的 LayoutParams,则高度是WRAP_CONTENT:

p = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0);

private void measureScrapChild(View child, int position, int widthMeasureSpec) {
  LayoutParams p = (LayoutParams) child.getLayoutParams();
  if (p == null) {
    p = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0);
    child.setLayoutParams(p);
  }

  ........
}

而LinearLayout等继承自ViewGroup的Layout,默认是:

LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)

protected LayoutParams generateDefaultLayoutParams() {
  return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
}

可用如下的方法,计算一个单独 inflate 出来的view的大小, 在某view的onMeasure方法中:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  if (mHeaderView != null) {
    measureChild(mHeaderView, widthMeasureSpec, heightMeasureSpec);
    mHeaderViewWidth = mHeaderView.getMeasuredWidth();
    mHeaderViewHeight = mHeaderView.getMeasuredHeight();
  }
}
原文地址:https://www.cnblogs.com/zijianlu/p/2682186.html