首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android view.getheight()第一次在onGlobalLayout()方法中没有给出正确的值

在Android开发中,view.getHeight()方法用于获取视图的高度。然而,在某些情况下,第一次调用view.getHeight()方法可能无法获得正确的值,特别是当该方法在onCreate()或onResume()等生命周期方法中调用时。这是因为在这些方法中,视图的布局尚未完成,因此视图的高度尚未确定。

为了解决这个问题,可以使用onGlobalLayout()方法来确保在视图布局完成后再获取视图的高度。onGlobalLayout()方法是ViewTreeObserver类的一个回调方法,用于监听视图树的布局变化。

以下是一种解决方案:

  1. 在Activity或Fragment中,获取视图的引用,例如:
代码语言:java
复制
View view = findViewById(R.id.your_view_id);
  1. 获取视图的ViewTreeObserver对象,并添加一个OnGlobalLayoutListener监听器,如下所示:
代码语言:java
复制
ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // 在视图布局完成后执行操作
        int height = view.getHeight();
        // 使用获取到的高度进行后续操作
        // ...
        
        // 在获取到高度后,记得移除监听器,避免重复调用
        view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    }
});

通过以上步骤,我们可以确保在onGlobalLayout()方法中获取到正确的视图高度。在该方法中,可以进行后续操作,如根据视图高度调整其他视图的布局、执行动画效果等。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

View三问—斗鱼真题

View宽高正确信息,因为viewmeasure过程与Activity生命周期是不同步,所以无法保证在这些生命周期里view measure已经完成。...所以主要有以下三个方法来获取view宽高: view.post()方法 方法runnable对象,能保证view已经绘制完成,也就是执行完measure、layout和draw方法了。...OnGlobalLayoutListener作用是当View树状态发生改变或者View树某view可见性发生改变时,OnGlobalLayoutListeneronGlobalLayout方法将会被回调...View.post()方法时,那些Runnable并没有马上被执行,而是保存到RunQueue里面,然后通过executeActions方法执行,也就是通过handler,post了一个延时任务Runnable...performDraw(); } 可以看到performTraversals方法执行了,但是view绘制之前,这是因为绘制之前就把需要执行runnable封装成Message发送到MessageQueue

56520

实现杂记(27):解决onCreate()过程获取Viewwidth和Height为04种方法

从这个结果可以看出,都是onResume之后才开始拿到这, 使用  onLayout()方法得到结果,会在第一次输出,当然这个函数会执行很多次,例如后面的又输出来一次, 其中subview输出是将...来确定别的view布局,但是onCreate()获取viewwidth和height会得到0.view.getWidth()和view.getHeight()为0根本原因是控件还没有完成绘制,你必须等待系统将绘制完...一般来讲Activity.onCreate(...)、onResume()方法中都没有办法获取到View实际宽高。...2、语法很简单 3、重写ViewonLayout方法 这个方法某些场景实用,比如当你所要执行东西应该作为他内在逻辑被内聚、模块化view,否者这个解决方案就显得十分冗长和笨重。...(); //height is ready 6 } 7 }; 需要注意是onLayout方法会调用很多次,所以要考虑好在这个方法要做什么,或者第一次执行后禁用掉你代码。

1.4K20

解决onCreate()过程获取Viewwidth和Height为0方法

那么onCreate()获取viewwidth和height会得到0呢,原因是Androidoncreate和onMesure是不同步,我们onCreate里面获取width和height,...控件还没有绘制完成呢。...针对上面的问题,网上提供了4种解决方案: 1,View.post() 此方法思路是onCreate里面执行一个线程,知道获取View宽高属性。...一般来说OnGlobalLayoutListener就是可以让我们获得到viewwidth和height地方 但是注意这个方法每次有些viewLayout发生变化时候被调用(比如某个View...4,重写ViewonLayout方法 我们知道Androidview绘制流程是onMesure->onLayout()顺序,所以onLayout获取也是真实数据。

1.2K80

android长截屏原理及实现代码

每次x或y相对于上次改动不能过大,若过大,view实际滚动距离可能达不到为MotionEvent设置(因view滚动时卡顿导致)。...截屏 当为MotionEvent设置x或y正好时当前view大小时,创建新bitmap,通过上述方法把view绘制到bitmap上,想要停止截屏时拼接所有bitmap即可。...由于ListView根据滑动距离是否大于ViewConfiguration.get(view.getContext()).getScaledTouchSlop() )来确定要不要滚动,所以一开始我们要特殊处理下...Listview也要通知是否滚动到了最后,不然如果没有手动停止的话,虽然还是一直分发滚动事件,但ListView不再滚动,导致最终截图后后面全是重复最后一屏幕。...//可以每次滚动n个像素,当发现下次再滚动n像素时就超出一屏幕时可以改变n,保证下次滚动后正好是一屏幕, //这样就可以根据(view.getHeight() / 2 - (int) motionEvent.getY

1.1K31

Android控件设置宽高比方法

困扰很久问题 Android控件宽和高保持比例,这是从我接触Android以来,一直不断会遇到需求。以前,要么就是代码里直接设置宽和高,要么就是自定义控件。...直到有了DataBinding,我们可以很方便地给控件加上自定义属性,也就可以很方便布局文件设置控件宽高比了。 1....属性必须加上@{},不然是按普通属性处理,不会调用我们方法,编译时会因为找不到属性报错。当然,这个属性只能根据高度计算宽度,如果要根据宽度计算高度,可以用同样方式再加一个属性。 2....原理简析 其实在编译后layout文件没有我们加属性(编译后layout文件build/intermediates/data-binding-layout-out下面可以看到)。...真正设置这个属性,还是Java代码中直接调用了我们绑定方法DataBinding自动生成Binding类,可以发现有类似下面这样调用。

2.4K20

android如何获取view布局高度与宽度详解

前言 可能很多情况下,我们都会有activity获取view 尺寸大小(宽度和高度)需求。面对这种情况,很多同学立马反应:这么简单问题,还用你说?你是不是傻。。...当我们 onCreate() 方法获取某个 View 组件宽度和高度,直接调用 getWidth()、getHeight()、getMeasuredWidth()、getMeasuredHeight...(); // 获取高度 } }); 七、使用 View.post() 方法 Runnable 对象方法会在 View measure、layout 等事件完成后触发。...UI 事件队列会按顺序处理事件, setContentView() 被调用后,事件队列中会包含一个要求重新 layout message,所以任何 post 到队列 Runnable 对象都会在...首先第一个方法,以前用过,确实不准确,猜测是应该是因为参数没有用好,因为参数只使用UNSPECIFIED未指定测量方式,一般像Wrap_Content,才是该测量方式。

5.8K10

最简单也最难——怎样获取到Android控件高度「建议收藏」

事实上是并没有简单,不信的话,你能够去试一下,onCreate里面,你是无法获得长宽,始终为0。 原因 这是为什么呢,事实上熟悉view绘制流程朋友应该一眼就看出来了。onCreate。...我们控件事实上还并没有画好,换句话说,等onCreate方法运行完了,我们定义控件才会被度量(measure),所以我们onCreate方法里面通过view.getHeight()获取控件高度或者宽度肯定是...我们须要注冊一个ViewTreeObserver监听回调,这个监听回调,就是专门监听画图,既然是监听画图,那么我们自然能够获取測量值了,同一时候。我们每次监听前remove前一次监听。...vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout...2个方法基本同样,但他是全局布局改变监听器,所以是最推荐使用

78610

Android实现Reveal圆形Activity转场动画完整步骤

,同时先隐藏布局视图 Activity A启动Activity B,Activity A先不销毁 Activity B启动之后开始动画,动画启动时显布局视图 销毁Activity A,如果需要返回则不销毁...四、实现 4.1 初始界面Activity A Activity A需要定义好主题、布局以及启动Activity B方法。...因为当不需要执行返回动画时候,要把Activity A销毁,这时候一定是在后台销毁,所以要把主题相关设置为透明,不然会在Activity B显示Activity A销毁界面。...在这段代码,把Activity A开始执行Reveal圆形动画坐标点传递给Activity B,因为动画是Activity B执行。...B同样需要定义好主题、布局以及执行动画方法

1.2K20

android监听View加载完成示例讲解

最近项目中需要实现一个GridView显示6*5=30项,并铺满整个界面,界面还有自定义ActionBar等其他控件,所以需要获取剩下屏幕高度。...() { //给GridView设置Adapter,adaptergetView获取GridView高度,在这个回调之前获取高度都是0 //处理完后remove掉,至于为什么,...= Gravity.CENTER_HORIZONTAL; tv_test.setLayoutParams(para); } } 运行程序,得到从android monitor可以看到,启动后调用了三次...到此三次之谜依旧没有解决,不过,可以肯定是,这个会重复 调用多次,使用时候需要注意。...解决办法就是第一次回调后,就把回调remove掉,如:gv_test.getViewTreeObserver() .removeOnGlobalLayoutListener(this); 如有错误,敬请雅正

2.8K10

android视图学习---从源码角度来理解onMeasure过程

* 父不没有对子施加任何约束,子可以是任意大小(也就是未指定) 7.   * (UNSPECIFIED源码处理和EXACTLY一样。...源码中使用getDefaultSize()只是简单测量了宽高实际使用时需要精细、具体测量。而具体测量任务就交给我们子类重写onMeasure方法。...view.getHeight()获取控件高度或者宽度肯定是0,因为它自己还没有被度量,也就是说他自己都不知道自己有多高,而你这时候去获取它尺寸,肯定是不行....,因为他是基于listener,OnGlobalLayoutListeneronGlobalLayout被回调之前是没有。...由于布局状态可能会发生多次改变,因此OnGlobalLayoutListeneronGlobalLayout可能被回调多次,所以我们第一次获得之后就将listener注销掉。

58520

巧用ViewPager 打造不一样广告轮播切换效果

,一定知道我5月6号时候推送了一篇文章,文章名为Android超高仿QQ附近的人搜索展示(一),通过该文可以利用ViewPager实现单页显示多个Item且能够添加一些炫酷动画效果。...下面进入正题,本文主要是利用ViewPager做类似上图风格Banner,这种Bannerapp上不是很常见,不过web端还有tvapp上还是很常见。...原理就一个属性android:clipChildren="false",该属性意思就是子View进行绘制时不要去裁切它们显示范围。...以下并不存在属性动画,所以setPageTransformer内部加了个判断,不过现在已经几乎没有3.0以下手机了,但是如果你非要较真,参考文章开始时给出两篇文章,里面有解决方案。...Page,那么对于alpha,只需要设置为最小即可。

60320

Android进阶之绘制-自定义View完全掌握(一)

AndroidUI设计可以说是决定一个app质量关键因素,因为人们使用app时候,最先映入眼帘就是app界面了,一个美观、充实界面能够给用户带来非常好体验,会在用户心中留下好印象。...我已经能正确点击到每一个圆环,而我代码只是将三个相对布局调换了一下位置,既然大圆环会覆盖到小圆环,那我们直接把大圆环放到最上面,这样就不会出现覆盖问题了。 这是我们需要注意一个点。...那很多人就有点子了,可以Tools类hideView()方法添加view.setEnabled(false);,然后showView()方法添加view.setEnabled(true);,有些人以为这样就能够解决...其实以为这样可以解决问题的人,他就不了解View和ViewGroup区别,View是不能够对孩子进行操作,而我们方法中将传递过来布局转换为了View,它原先某些属性就丢失了。...我们把Tools类四个方法View参数全部改为ViewGroup,然后对ViewGroup孩子进行禁止点击操作。具体代码如下。

59040

如何在onCreate获取View高度和宽度

如何在onCreate获取View高度和宽度 开发过程中经常需要获取到View宽和高,可以通过View.getWidth()和View.getHeight()来得到宽高。...然而新手们经常在onCreate方法中直接调用上面两个方法得到是0! 这是为什么呢? 因为View绘制是通过两个遍历来完成,一个measure过程,一个layout过程。...所以onCreate中直接使用View.getWidth()和View.getHeight()是无法得到正确。 那应该怎么onCreate获取View宽高呢?...开发者可以通过View.post()方法来获取到View宽高,该方法传递一个Runnable参数,然后将其添加到消息队列,最后UI线程执行。...()方法可以得到正确 Log.d(TAG,"view.width="+view.getWidth()+",view.height="+view.getHeight());

5.3K20

列表、存储以及WebView 相关优化

列表优化 ListView 优化逻辑 adaptergetView方法尽量少使用逻辑 尽最大可能避免GC 滑动时候不载入图片 将ListViewscrollingCache和animateCache...设置为false item布局层级越少越好 使用ViewHolder 使用RecyclerView adaptergetView方法尽量少使用逻辑 不要在你getView...GC就会频繁运行。所以getView()方法不要创建非常多对象。最好优化是,不要在ViewHolder以外创建不论什么对象。...你能够检查一下: item布局层级是否太深 getView()方法是否有大量对象存在 ListView布局属性 载入图片 假设你ListView须要显示从网络上下载图片的话。...这个方法含义应该都知道是绑定数据,并且是UI线程,所以要尽量在这个方法少做一些业务处理 数据优化 采用android Support 包下DIffUtil集合工具类结合RV分页加载会更加友好,节省性能

63510

安卓 View 工作流程

从getSuggestedMinimumWidth代码可以看出,如果View没有设置背景,那么View宽度为mMinWidth,而mMinWidth对应于android:minWidth这个属性所指定...这里再总结一下getSuggestedMinimumWidth逻辑:如果View没有设置背景,那么返回android:minWidth这个属性所指定,这个可以为0;如果View设置了背景,则返回...android:minWidth和背景最小宽度这两者最大,getSuggestedMinimumWidth和getSuggestedMinimumHeight返回就是ViewUNSPECIFIED...读者可以自行试一下,实际上onCreate、onStart、onResume均无法正确得到某个View宽/高信息,这是因为Viewmeasure过程和Activity生命周期方法不是同步执行...有没有什么方法能解决这个问题呢?答案是有的,这里给出四种方法来解决这个问题: Activity/View#onWindowFocusChanged。

41520

Android 浮动编辑框具体实现代码

Android输入法软键盘悬浮,最常见一种方法是通过给ViewTreeObserver添加ViewTreeObserver.OnGlobalLayoutListener当全局布局完成时或视图树中视图可见性发生变化时回调...onGlobalLayout方法onGlobalLayout方法获取当前窗口区域,获取区域高度如果超过屏幕五分之一一般认为是软键盘处于显示状态,区域高度即为输入法软键盘高度,通过此高度动态调整...:windowSoftInputMode=”stateVisible|adjustResize”,但是这种方法不是很灵活,一般解决不了产品需求。...</item </style 2.AndroidManifest.xml设置 <activity android:name=".FloatEditorActivity" android...:windowSoftInputMode="stateAlwaysVisible" android:theme="@style/NoTitleDialogTheme"/ 3.Activity

1.2K10

Android:ViewgetLocalVisibleRect()和getGlobalVisibleRect()区别

解决办法就是第一次回调后,就把回调remove掉,如:rectImage.getViewTreeObserver().removeOnGlobalLayoutListener(this); 测试不同情况下...OnGlobalLayoutListener调用次数: 1.启动后调用了三次onGlobalLayout。...(Android获取ActionBar高度链接) 所以目前结论是:getLocalVisibleRect(Rect r)方法可以把View长和宽映射到一个Rect对象上,映射参照物就是View本身左上角坐标系...而getGlobalVisibleRect(Rect r)方法可以把View整个屏幕偏移量映射到一个Rect对象上,映射参照物是屏幕左上角坐标系。...上面的情况是View没有超出屏幕区域数据,那么超出屏幕区域再次进行测试会发现1.getGlobalVisibleRect()方法作用是获取视图屏幕坐标可视区域。

1K10

android仿知乎ScrollView滚动改变标题栏透明度

刷知乎时候看到,专题栏里面 往下滚动标题栏会由透明逐渐变蓝色,觉得这个效果不错,就想自己写一下 这是自己实现效果图: ?...说下实现思路: 1、先获取顶部图片高度height,这个有3种方式获取,我用是监听onGlobalLayout方法回调 2、监听scrollview滚动坐标,原生没有这个监听,需要我们自己写个...view继承scrollview,然后重写onScrollChanged()方法,创建一个监听,在这个方法里面回调 3、根据图片高度height和滚动纵坐标y进行判断,算出比例,透明度范围0~255,...WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //返回是...imageView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout

1.4K20
领券