• 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();
      }
    }
  • 相关阅读:
    呵呵

    HDU 1878 欧拉回路
    HDU 3293 sort
    HDU 2714 ISBN
    神秀作偈
    大学之道
    写给自己过去疯狂的一年(2)(写在一个特别的时候)
    这几天我的生活就是这样的
    学习和研究计划
  • 原文地址:https://www.cnblogs.com/zijianlu/p/2682186.html
Copyright © 2020-2023  润新知