android 自定义控件之ViewGroup生命周期执行步骤

前言
  了解ViewGroup的生命周期的执行步骤对于自己自定义ViewGroup的时候十分重要,清楚了整个流程才能对ViewGroup有更深的理解。本文从个人的总结,来阐述一下执行的顺序。

执行说明

  首先ViewGroup的常用的生命周期主要有:构造方法、onLayout()、onFinishInflate()、onMeasure()、onSizeChanged(),前两种在创建ViewGroup子类的时候,必须重写。至于draw()和drawChild()是其用来绘制背景和子View用的,就不在生命周期里一一叙述。

第一种:在xml里直接引用的,执行顺序一般是:构造方法->onFinishInflate()(只执行一次)->onMeasure()(可能多次执行)->onSizeChanged()(在重新onMeasure的时候发现跟之前测量的尺寸不一样的时候就会回调此方法)->onLayout()(布置子View)->onMeasure()->onLayout().......
 
第二种:在Activity中setContentView( newCustomView(this))引用的,执行顺序与第一种相比,除了构造方法引用的不一致和不执行onFinishInflate()外,其他基本一致。
 
第三种:在Activity中直接new CustomView(this)而且不添加任何父布局的时候只会执行构造方法,其它不会执行。

总结技巧:

onMeasure()里一般是定义子控件的测量尺寸和宽高。
首先设置ViewGroup自身的尺寸如下:

int widthSize = MeasureSpec.getSize(widthMeasureSpec);  
int heightSize = MeasureSpec.getSize(heightMeasureSpec);  
setMeasuredDimension(widthSize, heightSize);

然后设置子View的尺寸例如下面:

View leftMenuView = getChildAt(1);  
MarginLayoutParams lp = (MarginLayoutParams)  
                leftMenuView.getLayoutParams();  
final int drawerWidthSpec = getChildMeasureSpec(widthMeasureSpec,  
                mMinDrawerMargin + lp.leftMargin + lp.rightMargin,  
                lp.width);  
final int drawerHeightSpec = getChildMeasureSpec(heightMeasureSpec,  
                lp.topMargin + lp.bottomMargin,  
                lp.height);  
leftMenuView.measure(drawerWidthSpec, drawerHeightSpec);  
  
View contentView = getChildAt(0);  
lp = (MarginLayoutParams) contentView.getLayoutParams();  
final int contentWidthSpec = MeasureSpec.makeMeasureSpec(  
                widthSize - lp.leftMargin - lp.rightMargin, MeasureSpec.EXACTLY);  
final int contentHeightSpec = MeasureSpec.makeMeasureSpec(  
                heightSize - lp.topMargin - lp.bottomMargin, MeasureSpec.EXACTLY);  
contentView.measure(contentWidthSpec, contentHeightSpec);

int getChildMeasureSpec(int spec,int padding,int childDimension) 返回的是测量尺寸规格spec,可以给子View设置padding,不需要设置padding就直接如contentView一样。
onLayout()布局子view的位置,基本上用到layout(left,top,right,bottom);

getWidth()和getMeasureWidth()的区别与联系:
getMeasuredWidth(): 只要一执行完 setMeasuredDimension() 方法,就有值了,并且不再改变。简单来说执行完onMeasure里的方法后就可以获取;
getWidth()只有在执行onMeasure()之后才能获取,但是可能应为布局大小调整发生变化,如果onLayout()没有对子View的宽高进行修改,那么两个值相等。

生命周期表:

参考:http://blog.csdn.net/anydrew/article/details/50985763

时间: 2024-10-11 15:17:10

android 自定义控件之ViewGroup生命周期执行步骤的相关文章

Android四大组件的生命周期

介绍生命周期之前,先提一下任务的概念 任务其实就是activity 的栈它由一个或多个Activity组成的共同完成一个完整的用户体验, 换句话说任务就是" 应用程序" (可以是一个也可以是多个,比如假设你想让用户看到某个地方的街道地图.而已经存在一个具有此功能的activity 了,那么你的activity 所需要做的工作就是把请求信息放到一个Intent 对象里面,并把它传递给startActivity().于是地图浏览器就会显示那个地图.而当用户按下BACK 键的时候,你的act

android知识点:Activity的生命周期

应用程序(或Activity)执行的状态称为进程(progress).在 Android操作系统中,每个应用程序都是一个进程.Android框架会维护一个唯一的Activity历史记录堆栈,并观察每个应用程序进程.同时,系统平台会依照系统的内存使用情况和Activity的状态来管理系统内存.Activity类别除了负责运行程序流程与操作系统界面组件外,最重要的就是它提供了开发者控制进程生命周期的函数. Android应用程序的生命周期是由Android框架进行管理的,而不是由应用程序自己直接控制

Android横竖屏切换生命周期

转自xiaoQLuhttp://www.cnblogs.com/xiaoQLu/p/3324503.html 开源帮助android获得了飞速的发展,开源也导致了数不清的碎片问题.android的前期系统就是一个半成品,不成熟的系统以及google的快速迭代开发,导致厂家完全跟不上google的步伐,你2.3的bug还没改完,4.0就出来了,4.0的bug还在处理,4.1出来了,最后的结果就是,手机厂家给每部手机一个系统版本,并且不能升级.最后苦逼的就是广大的程序猿们,你不得不考虑从2.1到4.

[Android]管理Activity的生命周期

一.简要介绍 当用户开始,暂停,退出,重新进入一个APP的时候,APP中Activity实例在它生命周期的不同状态之间转换.比如当你第一次启动一个Activity时,Activity来到系统的前端获得用户焦点.在这个过程中,Android系统调用了一系列生命周期方法.如果用户启动或者切换到另一个APP,系统调用另外一系列的方法. 生命周期调用方法可以说明在用户离开或者重新进入Activity时,Activity执行哪些行为. 接下来我们将解释每一个Activity都有的生命周期方法,并且说明如何

Android应用程序的生命周期

所谓的应用程序生命周期无非就是应用程序进程从创建到消亡的整个过程.但是,之所有将这一点拎出来单独的讲,当然有其特殊性.的确,Android应用程序的生命周期的终结这个动作并非由应用程序进程本身执行,而是取决于Android系统,也就是Android应用程序生死由“天”,不能主宰自己的命运.这与我们传统的编程思维可能有所程序,如最初学的C语言程序都是最后收到内部或者外部退出请求而运行中的进程从main函数通过return退出,而非由系统直接kill的,这样的情况很少.那么,Android的设计师们

Android 测试Service的生命周期

1 package com.example.myapp4; 2 3 import android.support.v7.app.ActionBarActivity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.Menu; 7 import android.view.MenuItem; 8 import android.view.View; 9 import android.w

【Android开发-8】生命周期,Activity中打开另外一个Activity

前言:生命中有许多人陪伴自己走过一生中的某段旅程,只是有些人只是某阶段出现,有些人却陪伴自己很久.就像小学.中学.高中.大学,那些曾经以为会长久拥有的,当经历过天涯各地地忙碌于生活,或如意,或失意:渐渐地那些画面只剩回忆.天涯各自安命,能在一起的就尽力珍惜吧,不在一起地就衷心地祝福,我们都需要一种姿态生活下去!Android中的Activity的生命中,我们经常需要打开另外一个Activity,即另外一个界面.这个可能出现的时间很短暂,然后又回到主界面.但是这两个Activity都在各自的生命周

activity生命周期分析(两个activity之间跳转的生命周期执行顺序)

NoteMainActivity点击跳转至NoteListActivity 我们都了解: 当A界面点击进入B界面时,此时 A===onPause--->onStop B===onStart--->onResume B界面退出,A界面显示,此时 B===onPause--->onStop A===onRestart--->onStart--->onResume 问:但是,是执行A的生命周期执行完再执行B的生命周期吗?或者B的执行完再执行A的吗? 答:不.   实际是 当A界面点

【Android开发-7】生命周期,Activity的生老病死

前言:生老病死,是每个人都要经历的事情.所以不必惊慌,静下心,想想自己在人生所处的每个阶段该做些什么,才能让自己的人生价值提高,或者说自身价值提高.在一个生命周期里,某个阶段该完成的事,没完成,也许就会影响到整个生命周期.所以有时候人生不能堕落,一堕落也许许多美好的事情就会错过了,等待你的就只有无声的忏悔! 对于Activity的生命周期的流程,最经典的一张图如下: 1.一个Activity A启动时,它会经历下面各个阶段: onCreate()-->onStart()-->onResume(