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();
      }
    }
  • 相关阅读:
    redhat 5.0 python2.4升级到2.7
    bindiff 4.2使用
    patchdiff2 函数比较插件
    OpenGL 获取当前屏幕坐标对应的三维坐标
    CsGL着色的三角形
    glEnable(GL_DEPTH_TEST)作用
    OpenGL之抗锯齿 以及 线宽的设置
    glLoadIdentity
    2.AngularJS-验证
    1.MVC概要与angular概要、模板与数据绑定
  • 原文地址:https://www.cnblogs.com/zijianlu/p/2682186.html
Copyright © 2011-2022 走看看