zoukankan      html  css  js  c++  java
  • 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();
      }
    }
  • 相关阅读:
    iOS项目的目录结构和开发流程
    XCode SVN设置
    iOS 登录 注册
    ios开发常用技巧
    iOS问题解答
    iOS设计模式
    iOS开发:打包应用程序
    iOS 封装
    iOS开发常用宏
    Objective-C 类,实例成员,静态变量,对象方法,类方法(静态方法),对象
  • 原文地址:https://www.cnblogs.com/zijianlu/p/2682186.html
Copyright © 2011-2022 走看看