(记录学习android遇到的问题)使用被weight分配空间后的控件高度值画新控件出现的问题

来源:互联网 发布:吸烟罚款 知乎 编辑:程序博客网 时间:2024/06/09 16:10

今天写小程序 我遇到这样的问题,我在代码中有很多画要出的控件,需要根据一个被权重weight分配的TextView的高度,计算后得到控件的高度。

然后就在 如何完美得到这个TextView的高度并画上其他控件 让我这个小白做了好久 。

没兴趣看小白摸爬滚打的可以直接看最后。



首先 getHeight() 是初始化屏幕图像时得到的高度数据 ,最多只是你屏幕的高度,

并且你花的控件和这个TextView都在onCreate时出现在屏幕上时,getHeight()得到的值是0,

也就是在用weigth时 android:layout-height=“0dp” 的0。


另外有个getMeasuredHeight() ,可以得到一个控件的全部高度,这个高度包括控件在屏幕的视线外的高度

通过询问我培训班的老师,告诉我正确的百度姿势,百度 再oncreate里得到控件的高度


于是我得到第一个方法


int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); 

 int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); 

imageView.measure(w, h); 

//他说这个就是需要得到的控件的高

 int height =imageView.getMeasuredHeight();


然而我Log出来的值是55 (后面做正确后得到的是135) 成像比预计的小点

原谅小白我第一次见到getMeasuredHeight() ,我以为他返回的是dp值(其实int a=getMeasuredHight()得到的是px)

就百度了dp转px的代码


/**       * 根据手机的分辨率从 dp 的单位 转成为 px(像素)       */   
    public  int dip2px(Context context, float dpValue) {    

//他说scale 是当前设备的分辨率 我的魅族4和模拟机三星Gs5这个值都是3.0f
       final float scale = context.getResources().getDisplayMetrics().density; 
          return (int) (dpValue * scale + 0.5f);   
    }



然而最后成像反而大了一些,小白这时都像我手足无措,尝试修改代码找哪出bug了。

百度所有不认识的方法都无果后(很多难的方法都是代码一大堆,不说主要作用是什么,让小白怎么学)

在询问老师的过程中对找的获取控件的 高的代码 准确性产生怀疑。接着老师建议我使用ViewTreeObserver的OnGlobalLayoutListener()


ViewTreeObserver是用来帮助我们监听某些View的某些变化的。OnGlobalLayoutListener()说是监听控件发生变化时调用


...OnGlobalLayoutListener(new OnGlobalLayoutListener() { 

    @Override   

    public void onGlobalLayout() { 

//移除该监听器

        imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);   


        textView.append("\n\n"+imageView.getHeight()+","+imageView.getWidth()); 

    }   

});


然而值得注意的是

 1.该监听器是在整个页面画完后调用 也就是如果画控件的代码直接写在类似这段代码的屁股后面。

那么你那些要得到这个高度进行画的控件将会把高度设为0画完后再调用到这个监听器,

2.该监听器会一直调用,需要移除这个监听器。

于是我吧我画控件的代码写在了public void onGlobalLayout() 里 由于第一次我没有移除这个监听器 他就拼命的画。

就移除了这个监听器。话说我原先也是用匿名内部类移除时却说OnGlobalLayoutListener抽象的不能实例化。

可能当时我哪打错了吧 反正小白不怕累,吧监听器写成声明对象。搞定


ViewTreeObserver.OnGlobalLayoutListener m=null;
               m = new ViewTreeObserver.OnGlobalLayoutListener() {
                   @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
                   @Override
                   public void onGlobalLayout() {
//得到高度 我所有的控件都在屏幕里所以就不用getMeasuredHeight() 了
                       height = aa.getHeight();
                       Log.e("ssh", "TextView控件高height" + height);
                       itemHeight = height;

//如果得到了要的高度 
                       if (itemHeight!=0)
                       {

//移除这个监听器removeOnGlobalLayoutListener是16以上用的 removeGlobalLayoutListener是16以下用的

//反正我自己写着玩就用16以上的api了
                           aa.getViewTreeObserver().removeOnGlobalLayoutListener(this);

//这是我画控件的常量数据
                           marTop = getResources().getDimensionPixelSize(R.dimen.weekItemMarTop);
                           marLeft = getResources().getDimensionPixelSize(R.dimen.weekItemMarLeft);

                           //        数据
                           getData();

                           //循环画控件
                           for (int i = 0; i < weekPanels.length; i++) {
                               weekPanels[i] = (LinearLayout) findViewById(R.id.weekPanel_1 + i);
                               initWeekPanel(weekPanels[i], courseData[i]);
                           }
                       }


                   }
               };

//添加监听器 aa是我的TextView
        aa.getViewTreeObserver().addOnGlobalLayoutListener(m);





0 0
原创粉丝点击