我的应用中有自定义视图。
在我的自定义视图中,我有一些Setter和Getter方法以及onMeasure()方法。
无论我执行多少次代码,为什么setter / getter方法总是在我的自定义视图的onMeasure()之前执行?
答案 0 :(得分:2)
因为视图层次结构尚未进行测量并且已对其执行布局传递。 Android为UI事件使用消息队列。在setContentView之后,它会调度视图层次结构的度量和布局传递。这不是立竿见影的,因为视图存在于内存中,所以你可以像示例代码一样调用它们上的方法。
答案 1 :(得分:0)
Activity类负责创建Phone Window;顶级视图层次结构,您可以通过调用setcontentview(resourceId)来放置自定义UI。
视图被绘制到窗口,然后分两个阶段进行处理:测量传递和布局传递。两者都是自上而下的视图层次结构(树)的递归遍历。在测量过程中,每个视图都存储了其测量值,即尺寸,样式和属性。
顶级电话窗口的视图绘制和处理是在次要线程中完成的,这是由Surface View完成的,它在整个窗口中打了整个并调整了它的位置。因此,您不能将活动主线程时序与Surface View线程时序相依赖。
更重要的是,在调用方法时,您正在使用活动主线程访问视图,该主线程执行的操作相对较少,然后执行Surface View辅助线程,因此onMeasure调用被延迟
答案 2 :(得分:0)
当Android遇到自定义视图时,会按照以下顺序进行渲染。
创建自定义视图:这意味着将调用自定义视图中定义的“构造函数”以初始化自定义视图的字段。
扩展布局表单XML:onFinishInflate():接下来,系统调用 onFinishInflate 一次查看,并且其所有子项都已从XML中膨胀。在添加所有儿童观点之后,这是通货膨胀的最后阶段。
此时自定义视图在系统中是“实时”类型,因此可以访问它的字段和方法(setter / getter)。
调用setContentView()后,系统准备视图进行渲染。
3.Layout相关的回调:通胀完成后,系统调用onMeasure(int,int)。事实上,此方法由measure(int,int)调用。
4.Drawing:当View的内容被渲染时调用。它是onDraw(android.graphics.Canvas)。
在示例代码中,当系统“准备”自定义视图进行渲染时,app正在调用自定义视图的方法(setter和getter),从而调用输出。
有趣点: 关于测量和布局的事情是,当窗口发生时,不能保证或要求将视图附加到窗口。 ListView特别是在附加项目视图之前执行测量,并且在计算诸如理想大小的事物之类的事情时执行这种对分离视图的推测测量通常非常有用。
上面的链接讨论了以上几点,它对自定义视图的“生命周期”类型进行了非常有用和详细的讨论。