也问:如何获得控件大小(高度、宽度等)尺寸信息?在Activity的OnCreate()中,用tv.getWidth()什么的得到的都是0,网上查来查去,大致上说应该是时机不对,onCreate()太早。请问应该在什么地方、什么时候查?

解决方案 »

  1.   

    在onDraw里边肯定,另外在 View.onMeasure、onLayout、或 onSizeChanged,记得调用 super.onXxxx,然后再检查尺寸是否>0了,这些应该也是可以的,你自己测试下看
      

  2.   

    试了一下,在前面几个周期函数里面都获取不到,然后在事件里面可以获取到,不知道是何缘故,还需进一步探讨:
    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            text = (TextView) findViewById(R.id.text);
            
            btn = (Button) findViewById(R.id.btn);
            
            btn.setOnClickListener(new Button.OnClickListener(){
    @Override
    public void onClick(View v) {
    int width = text.getWidth();
            int height = text.getHeight();
            Log.i("Log: ", "----------->"+width + " | " + height);
    }
            });
        }
      

  3.   


    3楼的办法有一定的局限性。我现在的是要程序运行好自动获取主View(可以理解为TextView,实际是自制的一个View派生类)的区域大小,以决定一些其它操作,比如要读入的文本长度等等,这就不可能靠等着人工去按个键再往下走了。
    《Csdn收音机》支持全屏截图功能啦,快来看看吧!
      

  4.   


                   int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
            int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
            ssidtext.measure(w, h);
            int width =ssidtext.getMeasuredWidth();
            int height =ssidtext.getMeasuredHeight();
      

  5.   

    onWindowFocusChanged的时候可以获得了
      

  6.   

    好吧总结下。。开始我在9楼的方法得到的高48.。长度随EditText里的文字长度变化。。后来有找了一个方法        ViewTreeObserver vto = ssidtext.getViewTreeObserver();
            vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                public boolean onPreDraw() {
                    int height = ssidtext.getMeasuredHeight();
                    int width = ssidtext.getMeasuredWidth();
                    return true;
                }
            });高还是48 长度是480.。xml里配置的是“fill_parent”所有是没错的。。
      

  7.   

    最后检验了下。。、        btn.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    int height = ssidtext.getHeight();//height=48
    int width = ssidtext.getWidth();//width=480
    }
    });具体使用那个。。看需求吧。。应该算是解决了 欢迎拍砖 ^_^
      

  8.   

    应该是你的办法更适合我,我正在试,没问题就送分结帖。谢谢!好人+高手~闲暇时光不想浪费吗?用《Csdn收音机》找个话题聊聊技术吧!
      

  9.   


    这个监听器会被多次执行。是不是还有更合理的地方?过去回1张贴就气喘吁吁,现在用了《Csdn收音机》,一口气回5张贴不费劲!
      

  10.   

    那就用这个监听吧        ViewTreeObserver vto = ssidtext.getViewTreeObserver();
     
            vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    int height = ssidtext.getMeasuredHeight();
                    int width = ssidtext.getMeasuredWidth();
                }
            });
      

  11.   


    这个要放在哪里?我放在Activity的onCreate()里报错:
    《Csdn收音机》在线检测最新版本,让你永不过期!
      

  12.   

    = =..导包啊。。import android.view.ViewTreeObserver.OnGlobalLayoutListener;
      

  13.   

    额~坑爹的Eclipse这回没给我提示呢。好像可以了,先上张没什么关系的效果图给您老养养眼,我再测试一下没什么问题就给您上分了。您今天小发了一笔哈,可能您也不会在乎,可是解决了我的大问题,希望以后能继续得到您的帮助。使用《Csdn收音机》截图功能,轻松制作图文并茂的文章!
      

  14.   

    在activity的onresume中调用控件的宽度和高度吧。oncreate还没有完成控件的布局,所以得不到宽度和高度
      

  15.   

    嗯哪,正在研究秒开任意大文件的可能性,互相学习不敢当,我水平差,只有膜拜和请教的份儿。您以后得多帮我啊。发帖子也有微博效果!一起用《Csdn收音机》吧!
      

  16.   


    这个事件会被激发多次,有时候点击某个按钮也会。我还没仔细分析代码。有情况我再细说。发帖子也有微博效果!一起用《Csdn收音机》吧!
      

  17.   


    噢。那可能是我的按钮响应代码里有不妥之处。等我有空仔细查查。暂时也只能这样了,我加了个判断,以避免多次运行。感谢你一直以来的支持,欢迎使用《Csdn收音机》!
      

  18.   

    太感谢了,我搞了2个多小时,终于找到这个帖子了。先前用measure方法,老是不对。
      

  19.   

    挖帖不好意思,这个方法拿到的height和width,要在onCreate里立刻使用还是不行诶?因为总是执行完成了onCreate才会去执行这个监听
    我想拿到这个height和width后在onCreate里用来设置其他view的位置(位置跟这个height和width的值有关系),似乎没办法用这个方法。