Activity中获取view的高度和宽度为0的原因以及解决方案
来源:互联网 发布:打印机合格证的软件 编辑:程序博客网 时间:2024/04/30 03:03
在activity中可以调用View.getWidth、View.getHeight()、View.getMeasuredWidth() 、View.getgetMeasuredHeight()来获得某个view的宽度或高度,但是在onCreate()、onStrart()、onResume()方法中会返回0,这是应为当前activity所代表的界面还没显示出来没有添加到WindowPhone的DecorView上或要获取的view没有被添加到DecorView上或者该View的visibility属性为gone 或者该view的width或height真的为0 所以只有上述条件都不成立时才能得到非0的width和height
所以要想获取到的width和height为真实有效的 则有以下方法
1.在该View的事件回调里使用 这时候该view已经被显示即被添加到DecorView上 如点击事件 触摸事件 焦点事件等
- View view=findViewById(R.id.tv);
- view.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- int width = v.getWidth();
- }
- });
2.在activity被显示出来时即添加到了DecorView上时获取宽和高如onWindowFocusChanged() 回调方法
- @Override
- public void onWindowFocusChanged(boolean hasFocus) {
- View iv1 = findViewById(R.id.iv1);
- View iv2=findViewById(R.id.iv2);
- String msg1="iv1' width:"+iv1.getWidth()+" height:"+iv1.getHeight()+" measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight();
- String msg2="iv2' width:"+iv2.getWidth()+" height:"+iv2.getHeight()+" measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight();
- i("onWindowFocusChanged() "+msg1);
- i("onWindowFocusChanged() "+msg2);
- super.onWindowFocusChanged(hasFocus);
- }
3.或在onResume方法最后开线程300毫秒左右后获取宽和高 因为onResume执行完后300毫秒后 界面就显示出来了
当然地2种和地3种方法要保证获取宽高的view是在setContentView时设进去的View或它的子View
- view.postDelayed(new Runnable() {
- @Override
- public void run() {
- View iv1 = findViewById(R.id.iv1);
- View iv2=findViewById(R.id.iv2);
- String msg1="iv1' width:"+iv1.getWidth()+" height:"+iv1.getHeight()+" measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight();
- String msg2="iv2' width:"+iv2.getWidth()+" height:"+iv2.getHeight()+" measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight();
- i("onWindowFocusChanged() "+msg1);
- i("onWindowFocusChanged() "+msg2);
- }
- }, 300);
4.在onCreate()或onResume()等方法中需要获取宽高时使用getViewTreeObserver().addOnGlobalLayoutListener()来添为view加回调在回调里获得宽度或者高度获取完后让view删除该回调
- // 获取组件宽度方式
ViewTreeObserver vto = mTextView02.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@SuppressLint("NewApi") public void onGlobalLayout() {
// TODO 自动生成的方法存根
itemWidth = mTextView02.getWidth();
String content = handleStartListTextView(str.get(0));
mTextView02.setText(content + "\n2015-2-6");
// 启动计时器,1秒后开始执行竖直跑马灯
handler.postDelayed(runnable, 3000);
// view删除该回调
mTextView02.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
5.在窗口焦点发生变化时获取宽高 onResume完后就会把界面渲染到窗口上 渲染完后将执行窗口焦点花生变化回调 所以onResume到 onWindowFocusChanged为把界面渲染到窗口的时间
- boolean measure;
- View iv1;
- View iv2;
- @Override
- public void onWindowFocusChanged(boolean hasFocus) {
- super.onWindowFocusChanged(hasFocus);
- if(hasFocus && !measure){
- measure=true;
- measure();
- }
- }
- private void findViews(){
- iv1 = findViewById(R.id.iv1);
- iv2 =findViewById(R.id.iv2);
- }
- private void measure(){
- String msg1="iv1' width:"+iv1.getWidth()+" height:"+iv1.getHeight()+" measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight();
- String msg2="iv2' width:"+iv2.getWidth()+" height:"+iv2.getHeight()+" measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight();
- i("onWindowFocusChanged() "+msg1);
- i("onWindowFocusChanged() "+msg2);
- }
转载自:http://blog.csdn.net/nailsoul/article/details/25909313
- Activity中获取view的高度和宽度为0的原因以及解决方案
- Activity中获取view的高度和宽度为0的原因以及解决方案
- Activity中获取view的高度和宽度为0的原因以及解决方案
- Activity中获取view的高度和宽度为0的原因以及解决方案
- Activity中获取view的高度和宽度为0的原因以及解决方案
- Activity中获取view的高度和宽度为0的原因以及解决方案
- Activity中获取view的高度和宽度方法
- activity启动时获取view的高度和宽度
- 获取view的高度和宽度(在onCreate方法中)
- 自定义view中获取字符串的宽度和高度
- 在oncreate中如何获取view的高度和宽度
- onCreate()中获取View的宽度和高度
- 如何在onCreate中获取View的高度和宽度
- 如何获取view的宽度和高度
- 获取View的高度和宽度
- Android 获取View的高度和宽度
- Android获取View的宽度和高度
- Android获取View的宽度和高度
- Java 8特性探究(1):通往lambda之路_语法篇
- Javascript如何创建一个新的实例(指针)
- CSS 基础教程目录
- 03python_function
- 关于http请求头host字段中的port
- Activity中获取view的高度和宽度为0的原因以及解决方案
- cocos2d-x核心概念(二)——字符串,标签和菜单
- 上传文件的服务
- 52nod 1012最小公倍数LCM
- 彻底理解ThreadLocal
- iOS事务的基本概念
- Android查询 每个进程的权限
- win7 iis 配置PHP5.3.27实践记录
- windows下使用cpanm进行模块安装