2016年3月30日 偶尔的坚持比科学更重要
最近常常用到自定义的View和ViewGroup,且发现在自定义时总是出现一些莫名奇妙的问题,其大部分的原因可以归咎于View的生命周期。
View相当于一个Panel,所有的UI组件都继承了View。为了了解他,让我们先看看他的一些方法。
View常被重写的方法:
(这里就任性的略去了focus、trackball这些没用的东西了)
void onFinishInflate():当应用程序通过XML布局文件加载该组件从而进行构建界面时,该方法将会被调用
onMeasure(int widthMeasureSpec, int heightMeasureSpec):用来检测View组件和其子组件的大小,其参数为为该View设置的长和宽
onLayout(boolean changed, int left, int top, int right, int bottom) :用于分配view在父控件的位置,即给view布局
onSizeChanged(int w, int h, int oldw, int oldh):当该组件的大小被改变时,调用该方法
onDraw(Canvas canvas):用于绘制组件
onKeyDown(int keyCode, KeyEvent event):当有按键被按下时出发该方法(可以监听返回键,home键)
onKeyUp(int keyCode, KeyEvent event):当有按键被松开时出发该方法
onTouchEvent(MotionEvent event):当发生触摸屏事件时触发该方法
onAttachedToWindow():当将这个组件放入某个窗口时调用该方法
onDetachedFromWindow():当将这个组件从某个窗口分离时调用这个方法
onWindowVisibilityChanged(int visibility):当包含该组件的窗口的可见性发生改变时调用该方法
onVisibilityChanged(View changedView, int visibility):当该view的是否可见发生变化时,调用该方法
onWindowVisibilityChanged和onVisibilityChanged中visibility参数的三个值:
visible 0 代表view可见,是默认值
invisible 4 代表组件不可见,但保留控件的布局位置
gone 8 代表组件隐藏,不保留控件的布局位置,如果组建的visibility属性为gone,则代表该组件生命周期结束
测试View的生命周期
简单的介绍了这些方法之后,让我们再来看这些这些方法什么时候会被调用。
下面是我的测试代码,还是有必要贴出来的:
public class MyView extends View {
public MyView(Context context) {
super(context);
Log.i("infoview", "==========MyView(context)");
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
Log.i("infoview", "MyView(context,attrs)" + attrs.getAttributeName(0)
+ "===" + attrs.getAttributeName(2));
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
&#