1.在API中对View的回调流程有一个详细的描述,下面给出了原文翻译:
1.Creation:创建
1.1----Constructors(构造器)
在构造器中有一个表单负责View从代码中创建和从Layout File 文件中创建,第二个表单负责解析和应用一些在Layout File中定义的属性。
默认的布局文件调用的是两个参数的构造方法
1.2---- onFinishInflate()
当View和他的所有子View从XML中解析完成后调用。
这个是当系统解析XML完成,并且将子View全部添加完成之后调用这个方法,我们通常重写这个方法,在这个方法中查找并获得子View引用
@Override
protected void onFinishInflate() {
mHandle = findViewById(mHandleId);
if (mHandle == null) {
throw new IllegalArgumentException("The handle attribute is must refer to an"
+ " existing child.");
}
mHandle.setOnClickListener(new DrawerToggler());
mContent = findViewById(mContentId);
if (mContent == null) {
throw new IllegalArgumentException("The content attribute is must refer to an"
+ " existing child.");
}
mContent.setVisibility(View.GONE);
}
1.3-----onAttachedToWindow
当view黏附在当前window时调用
1.4----onWindowVisibilityChanged(int)
在当前window中的view发生改变时调用
2.
Layout :布局
2.1----onMeasure(int, int)
确定View和它所有的子View要求的尺寸时调用
测量这个View的高和宽。通过调用这个方法来设置View的测量后的高和宽,其最终调用的方法是:
protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) {
mMeasuredWidth = measuredWidth;
mMeasuredHeight = measuredHeight;
mPrivateFlags |= MEASURED_DIMENSION_SET;
}
可见其最终是将高和宽保存在mMeasuredWidth、mMeasuredHeight这两个参数中。
其实调用onMeasure(int, int)的方法的不是系统,而是 public final voidmeasure(int widthMeasureSpec, int heightMeasureSpec)
2.2----onLayout(boolean, int, int,int, int)
当这个View为其所有的子View指派一个尺寸和位置时调用
2.3---- onSizeChanged(int, int, int,int)
当这个View的尺寸改变后调用
3.
Drawing :绘制
3.1---- onDraw(Canvas)
当View渲染其内容时调用
4.Event processing :事件流程
4.1----onKeyDown(int, KeyEvent)
当一个新的键按下时
4.2 ---- onKeyUp(int, KeyEvent)
当一个键弹起时
4.3----onTrackballEvent(MotionEvent)
当滚迹球事件发生时。
4.4----onTouchEvent(MotionEvent)
当一个触摸屏事件发生时。
5.Focus :焦点
5.1 ---- onFocusChanged(boolean, int,Rect)
当View得到和失去焦点时调用
5.2---- onWindowFocusChanged(boolean)
当Window包含的View得到或失去焦点时调用。
6.Attaching 依赖onWindowVisibilityChanged(int)
6.1----onWindowVisibilityChanged(int)
在当前window中的view发生改变时调用
6.2----onDetachedFromWindow()
当view从当前window去掉时调用