我在Activity的布局文件中定义了多个View,然后想根据屏幕的大小动态调整各个View的大小。但是在Activity的onCreate方法里面调用View.getHeight()返回的值是0,我想这是因为View还没显示的原因,但是有什么方法可以知道View的大小呢,在Activity的什么地方调用?
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.manage_account);
int height = findViewById(R.id.ListView_Title).getHeight();
Log.v("Title Height", String.valueOf(height));
init();
}

解决方案 »

  1.   

    onCreate时控件没有真的建立,你可以用个handler延时500ms再获取就好了。
      

  2.   

    谢谢DrSmart,不过还有其他的解决办法吗?感觉Handler延时这个方法不够完美。
      

  3.   

    我觉得就像LS说的做一个延时 , 然后获取就OK了啊 
    ,不够完美?LZ想要什么效果哦
      

  4.   

    1. 建议使用dp等自适应的单位来调整布局。以及wrap_content这些属性。
    2. 对于不同屏幕的支持,也可以将数值写在values-hdpi, values-mdpi, values-ldpi中的dimens.xml的文件中。
      

  5.   

    我的解决办法是先算出来顶上Title部分的高度,然后再View画图时,按照百分比来分配每个View的高度,宽度,再进行绘图,这样来保证每个屏幕上的比例都是一样的2. 对于不同屏幕的支持,也可以将数值写在values-hdpi, values-mdpi, values-ldpi中的dimens.xml的文件中。
    这个最让我觉得不方便的就是那些不规则的屏幕,因为有时候OPhone的那个标题框就比Android的要高,此类的问题等很麻烦
      

  6.   

    你在onstart里面用那些方法,另外getMeasuredHeight()和getHeight()这两种方法返回的值是有区别的,你想清楚到底是要那种值。
      

  7.   

    getHeight()是layout完了之后实际的值。和你在xml中声明的不一定相同。
      

  8.   

    还是需要handler解决,放在onResume()里面还是不行。谢谢各位了!
      

  9.   

    哈哈 这个问题在Hello Android里面提过 有两种解决方法
    一个在onsizechanged里面改
    一个在ondraw里面调用getwidth
    但都是在view里面改
    不懂为啥在activity里面改
    如果你有很多view是不是可以考虑用一个compound view把所有view加在一起 然后在它的ondraw里面调用?
      

  10.   

    一般在刚开始开发android时,会犯一个错误,即在View的构造函数中获取getWidth()和getHeight(),当一个view对象创建时,android并不知道其大小,所以getWidth()和getHeight()返回的结果是0,真正大小是在计算布局时才会计算,所以会发现一个有趣的事,即在onDraw( ) 却能取得长宽的原因。
      

  11.   

    如果 你想获取 机器屏幕的大小:
            DisplayMetrics dm=new DisplayMetrics();
            this.getWindowManager().getDefaultDisplay().getMetrics(dm);
            int i1=dm.widthPixels;
            int i2=dm.heightPixels;如果你想 获取某个layout的大小
    用layoutinflater 来动态载入