自定义控件其实很简单3/4

尊重原创转载请注明:From AigeStudio()Power by Aige 侵权必究!

炮兵

镇楼

隐约雷鸣 阴霾天空 但盼风雨来 能留你在此

隐约雷鸣 阴霾天空 即使天无雨 我亦留此地

上一节我们细致地、猥琐地、小心翼翼地、犹如丝滑般抚摸、啊不,是讲解了如何去测量一个布局控件,再次强调,如我之前多次强调那样,控件的测量必须要逻辑缜密严谨,尽量少地避免出现较大的逻辑错误。在整个系列撰写的过程中,有N^N个朋友曾多次不间断地小窗我问View是否也有生命周期,我也多次细心地、耐心地打开小窗然后默默地关掉它,不是我不愿回答而是问的人太多我们干脆就在blog中详细阐述下,即便你是第一天学习Android,你也一定会用到Activity,用到Activity你一定会接触到onCreate方法,然后你会从各种途径了解到类似这样的方法还有7个,我们称之为Activity生命周期:

/** * 主界面 * * @author Aige {@link } * @since 2014/11/17 */public class MainActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overrideprotected void onStart() {super.onStart();}@Overrideprotected void onResume() {super.onResume();}@Overrideprotected void onPause() {super.onPause();}@Overrideprotected void onStop() {super.onStop();}@Overrideprotected void onRestart() {super.onRestart();}@Overrideprotected void onDestroy() {super.onDestroy();}}Android framework在Activity的不同时期调用不同的生命周期方法并将其提供给我们以便我们能在Activity加载的不同时期根据自己的需要做不同的事,For example:我们可以在onCreate中设置我们的布局文件或显示的View,在onStop中处理Activity位于后台时的操作,在onDestroy中销毁一些不必要的强引用避免在Activity销毁后造成泄漏等等等等,这些方法给我们控制Activity带来了极大的便利,而在View中我们也学习了onMeasure、onLayout和onDraw这三个类似的方法,它们也是依次在View创建的不同时期被调用,那么是否还应存在其他类似的方法呢?The answer is yes,View也提供了一下几个类似“生命周期”的方法:

如上所示的这些方法,除了提到的“生命周期”方法外还有一些事件的回调,多说无益,我们还是来看看这些方法会在View的什么时候被调用,老样子我们新建一个继承于View的子类并重写这些方法:

/** * * @author AigeStudio {@link } * @since 2015/1/27 * */public class LifeCycleView extends View {private static final String TAG = "AigeStudio:LifeCycleView";public LifeCycleView(Context context) {super(context);Log.d(TAG, "Construction with single parameter");}public LifeCycleView(Context context, AttributeSet attrs) {super(context, attrs);Log.d(TAG, "Construction with two parameters");}@Overrideprotected void onFinishInflate() {super.onFinishInflate();Log.d(TAG, "onFinishInflate");}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);Log.d(TAG, "onMeasure");}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);Log.d(TAG, "onLayout");}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);Log.d(TAG, "onSizeChanged");}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Log.d(TAG, "onDraw");}@Overrideprotected void onAttachedToWindow() {super.onAttachedToWindow();Log.d(TAG, "onAttachedToWindow");}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();Log.d(TAG, "onDetachedFromWindow");}@Overrideprotected void onWindowVisibilityChanged(int visibility) {super.onWindowVisibilityChanged(visibility);Log.d(TAG, "onWindowVisibilityChanged");}}上面的方法中我过滤掉了事件和焦点触发的方法,仅看View运行时被调用的方法,运行看看我们LogCat中的输出:

首先是调用了构造方法,这是不用猜都该知道的,然后呢调用了onFinishInflate方法,这个方法当xml布局中我们的View被解析完成后则会调用,具体的实现在LayoutInflater的rInflate方法中:

public abstract class LayoutInflater {void rInflate(XmlPullParser parser, View parent, final AttributeSet attrs,boolean finishInflate) throws XmlPullParserException, IOException {// 省去无数代码…………if (finishInflate) parent.onFinishInflate();}}也就是说如果我们不从xml布局文件中解析的话,该方法就不会被调用,我们在Activity直接加载View的实例:public class MainActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new LifeCycleView(this));}}这时再次运行我们的APP,就会发现不会再去调用onFinishInflate方法:

我不但的回首,伫足,然后时光扔下我轰轰烈烈的向前奔去。

自定义控件其实很简单3/4

相关文章:

你感兴趣的文章:

标签云: