用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(); } }