聪明出于勤奋,天才在于积累

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

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

 

 

 

posted on 2012-09-12 17:56    阅读(249)  评论(0编辑  收藏  举报