(Android)View.getHeight或getWidth为0时的一些解决方案

在Android开发过程中,经常需要动态的更改View的大小,有些View的大小可能需要根据其他View的大小来设定,或者你需要得到一些View的大小来进行某项操作,但是有可能你需要在onCreate中就得到这个值,但是有些Android基础的开发人员都清楚,Android在onCreate方法(或者OnResume)中并不知道这些View的大小。这个时候我们需要怎么办呢?

1.第一种暴力方式

你可以写一个子线程,让它先延迟几百毫米,然后再去获取View的大小,哈哈,这种方法好扯淡,我也这么觉得。。

2.在onWindowFocusChanged 监听中获取

onWindowFocusChanged方法的调用时机是窗口获取到焦点的时候,这个时候View都已经绘制完毕了,正确的Height和Width也就能够得到了。

3.使用View.post

1 mView = findViewById(R.id.textview);
2         mView.post(new Runnable() {
3             @Override
4             public void run() {
5                 int viewWidth = mView.getWidth();
6                 int viewHeight = mView.getHeight();
7                 Log.d(TAG, "viewWidth:" + viewWidth + "\nviewHeight:" + viewHeight);
8             }
9         });

这种方式可以让runable中的run方法在绘制完毕后去执行,但是这种方式我这不知道为什么,有时候需要我去点击一下屏幕,或者做其他操作后,才会去执行,不明所以

4.使用Handler

这种方式大部分人都能够想到

5.监听Draw/Layout事件:ViewTreeObserver

ViewTreeObserver greenObserver = mView.getViewTreeObserver();
                        greenObserver.addOnPreDrawListener(new OnPreDrawListener() {

                            @Override
                            public boolean onPreDraw() {
                                mView.getViewTreeObserver().removeOnPreDrawListener(this);
                                int height = mView.getHeight

                                return true;
                            }
                        }); 
时间: 2024-12-21 13:28:19

(Android)View.getHeight或getWidth为0时的一些解决方案的相关文章

Android View

1.View坐标 (1)View的坐标参数主要有哪些?分别有什么要注意的要点? 几个主要的坐标参数: 1)Left,Right,top,Bottom:他们表示的并非是距离屏幕左上方的绝对值,而是表示view和他的父控件的相对坐标值,并且代表View的初始坐标,在绘制完毕后就不会再改变. 2)X和Y表示的是View左上角相对于父控件的坐标值,即实时相对坐标. 3)TranslationX,translationY这两个值,默认都是0,表示的是相对于父控件的左上角的偏移量. 他们之间的换算关系是:

android view从无到有的过程

在搜集Android view绘制流程的相关知识时,发现这里面的流程还是有些复杂的,准备了好几天,才敢提起笔来.下面就直入主题吧! view绘制流程是从ViewRoot的performTraversals()方法中开始的,在该方法中会执行view绘制的三部曲,即:measure(测量视图的大小),layout(确定视图的位置)draw(绘制视图的内容).下面这张图明确的展示了该过程: 1.measure的过程 public final void measure(int widthMeasureS

android 中遇到 imageView getWidth 始终为0 时 ,设置 setImageBitmap 的方法

先说说我的遇到的问题: 1. 我在activity里写一个 fragment 2.这个fragment里有个 imageView ,用于显示图片. 我使用 asyncTask获得图片,并准备在这个imageView 中显示该图片的缩略图,我准备使用  ThumbnailUtils.extractThumbnail 方法生成缩略图. 我们先看看ThumbnailUtils.extractThumbnail(source, width, height);  这个方法的参数   source 源文件(

Android项目部署时,发生AndroidRuntime:android.view.InflateException: Binary XML file line #168: Error inflating class错误

这个错误也是让我纠结了一天,当时写的项目在安卓虚拟机上运行都很正常,于是当我部署到安卓手机上时,点击登陆按钮跳转到用户主界面的时候直接结束运行返回登陆界面.    当时,我仔细检查了一下自己的代码,并没有发现什么问题,在logcat上显示的报错如下:AndroidRuntime:android.view.InflateException: Binary XML file line #168: Error inflating class(这是其中报错的最主要的一行信息).  于是我在百度上几乎查看

升级android sdk到5.0时,创建项目出现错误:No resource found that matches the given name 'android:Widget.Material.A

升级sdk 到5.0时,创建项目时会多创建一个库项目,叫appcompat_v7. 创建完成后,这个项目可能会报错,诸如出现:No resource found that matches the given name 'android:Widget.Material.ActionButton'等错误. 下面是一些解决方案: 解决方案1: 使用sdk manager下载以下内容: 解决方案2: 如果你不想创建appcompat_v7,你可以在创建项目时将minimum Required SDK设置

Unable to start activity ComponentInfo{com.example.administrator.myapplication/com.example.administrator.myapplication.MainActivity}: android.view.InflateException: Binary XML file line #0: Binary XM

本来就是把fragment写死在activity的xml模板里面,结果报了这个错误, Unable to start activity ComponentInfo{com.example.administrator.myapplication/com.example.administrator.myapplication.MainActivity}: android.view.InflateException: Binary XML file line #0: Binary XM,,下面找到了解

Eclipse编译Android项目时出现的问题:Android requires compiler compliance level 5.0 or 6.0. Found '1.8' instead.

Consle: Android requires compiler compliance level 5.0 or 6.0. Found '1.8' instead. Please use Android Tools > Fix Project Properties. 然而,按照提示的方法,右键项目->Android Tools->Fix Project Properties时,发现并没有卵用... 我的解决方式是: 右键项目->Properties,把 JavaCompiler

Android不能乱用的View.getHeight()(尤其是UI线程里)

原因: 这是一个很有趣的BUG View.getHeight(),得到的高度居然和我们想的不一样,这个是从XListView的一个BUG说起,刚开始以为是Scroller没有执行,经过一个小时的调试,发现原因是在这里,View.getHeight(),返回的高度和真实的高度不一样. 解决方案: 原来的代码 public int getVisiableHeight() { return mContainer.getHeight(); } FIXED后的代码: public int getVisia

Android View 事件分发机制 源码解析 (上)

一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志~ MyButton [java] view plain copy package com.example.zhy_event03; import android.content.Context; import andr