我最初的问题是需要知道我的根的高度和宽度View
这样我就可以进行程序化的布局更改。就我的目的而言,我不一定需要在onCreate()
;对于我来说,以编程方式添加我的孩子就足够了View
根布局完成后,因此我很乐意使用onWindowFocusChanged()
作为一个钩子来确定何时调用 rootView
's getWidth()
and getHeight()
将返回有效结果。
不过我看到不少人问如何确定根View
期间的尺寸onCreate()
。我猜人们希望这样做是为了更好的用户体验 - 也许这样用户就不会看到分阶段构建的布局(如果有人能澄清原因,我将不胜感激)。现在,我常见的答案是这样的here https://stackoverflow.com/questions/3602026/linearlayout-height-in-oncreate-is-0,就是发布一个Runnable
到根View
within onCreate()
。里面那个Runnable
我们执行getWidth()
等等。这之所以有效,显然是因为,Runnable
发布到 a 的对象View
被执行时View
有布局和/或附加到窗口。
这引出了我的问题。在 API 文档中View
,它似乎没有描述这种行为。那么,谁能告诉我它的定义和记录在哪里?或者说,这是一个检查来源的问题吗?它是一个绝对且严格定义的特征吗?Runnables
将入住View
的队列并且仅在布局过程之后的某个点进行处理?
进一步澄清:在阅读克里的答案并仔细考虑一下后,我的基本问题可以澄清如下:在给出的答案中here https://stackoverflow.com/questions/3602026/linearlayout-height-in-oncreate-is-0并且也在这个代码项目入口 http://www.codeproject.com/Tips/313848/Get-actual-screen-size-for-the-application-layout,我明白我们解决了根源问题View's
期间无法获得尺寸onCreate()
通过发布Runnable
to the View
。正如克里指出的,这条消息的保证是Runnable
无法执行,直到onCreate()
已执行。我知道布局发生在之后的某个时刻onCreate
,但我现在还是不明白为什么会这样Runnable
应该执行时View
的尺寸已知。
我看了一下View.post(可运行) http://developer.android.com/reference/android/view/View.html#post%28java.lang.Runnable%29方法,在我看来,通过调用该方法,您只是将一条消息添加到 UI 线程队列中。唯一“保证”的是 Runnable 将在调用 post(Runnable) 的方法完成后的某个时间执行。这假设您从 UI 线程调用 post(Runnable) 但正如文档所说:
仅当此 View 附加到窗口时,才能从 UI 线程外部调用此方法。
我认为要确保您的根视图和子视图都有大小,您需要从子视图 onSizeChanged() 方法中调用 post(Runnable) 因为如果子视图有大小,我认为它遵循父视图,即根视图也必须有尺寸。
如果这个答案有点漫无目的,我深表歉意。我有点理解你想要实现什么,但不是 100% 确定。如果您想让我澄清任何事情,请告诉我。
就我个人而言,每当我需要视图的大小时,我都会在 onSizeChanged() 中执行所有操作,我相信这是“正确”的执行方式,并且它始终有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)