标签:
大部分的安卓开发者都会遇到在onCreate方法中来获取元件的宽高来进行一些处理,但是遗憾的是得到的所有结果都是0,这是由于安卓的渲染模式决定的,在元件创建但未显示时无法获取元件的固定宽高,在这里分享一下在onCreate方法中获取元件宽高的几种方法:
方法一:
/** * 测量方法 获取组件的尺寸大小 * */ int width = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); int height = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); button.measure(width,height); int buttonHeight = button.getMeasuredHeight(); int buttonWidth = button.getMeasuredWidth(); Log.e(Tag,"计算方法获取组件大小button.width = " + buttonWidth + " button.height = " + buttonHeight);
方法二:
/** * 增加整体布局监听 * */ ViewTreeObserver vto2 = button.getViewTreeObserver(); vto2.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { button.getViewTreeObserver().removeGlobalOnLayoutListener(this); int height =button.getMeasuredHeight(); int width =button.getMeasuredWidth(); Log.e(Tag,"整体布局监听获取组件大小button.width = " + width + " button.height = " + height); TextView tv = new TextView(MainActivity.this); tv.setText("Hello World!"); tv.setTextColor(Color.RED); tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); layout.addView(tv); } });
方法三:
/** * 增加组件绘制监听方法(该方法有时无效,具体原因未知) * */ ViewTreeObserver vto = button.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { // TODO Auto-generated method stub int height = button.getMeasuredHeight(); int width = button.getMeasuredWidth(); Log.e(Tag,"组件绘制监听获取组件大小button.width = " + width + " button.height = " + height); return true; } });
其实还有一个非常好的方法,独立于我们所了解的安卓生命周期之外,在onResume方法之后,Activity还会调用public void onWindowFocusChanged(boolean hasFocus)这个方法,你会神奇的发现,在这个方法里面所有你想要的元件尺寸没有你得不到的,但是该方法在每次窗口焦点改变时都会调用,善用该方法,会有你意想不到的效果。
标签:
原文地址:http://www.cnblogs.com/chlewsz/p/4445406.html