开发者社区> 技术小胖子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Android重写view时onAttachedToWindow () 和 onDetachedFromWindow ()

简介:
+关注继续查看

     在重写View的时候,会遇到这两个方法

protected void onAttachedToWindow()

Description copied from class: View

This is called when the view is attached to a window. At this point it has a Surface and will start drawing. Note that this function is guaranteed to be called before View.onDraw(Android.graphics.Canvas), however it may be called any time before the first onDraw -- including before or after View.onMeasure(int, int).
Overrides: 
onAttachedToWindow in class View

当此view附加到窗体上时调用该方法。在这时,view有了一个用于显示的Surface,将开始绘制。注意,此方法要保证在调用onDraw(Canvas) 之前调用,但可能在调用 onDraw(Canvas) 之前的任何时刻,包括调用 onMeasure(int, int) 之前或之后。

看得出次方法在onDraw方法之前调用,也就是view还没有画出来的时候,可以在此方法中去执行一些初始化的操作,google的AlarmClock动态时钟View就是在这个方法中进行广播的注册,代码如下:

[java] view plain copy
  1. @Override  
  2.     protected void onAttachedToWindow() {  
  3.         super.onAttachedToWindow();  
  4.   
  5.         if (Log.LOGV) Log.v("onAttachedToWindow " + this);  
  6.   
  7.         if (mAttached) return;  
  8.         mAttached = true;  
  9.   
  10.         if (mAnimate) {  
  11.             setBackgroundResource(R.drawable.animate_circle);  
  12.             /* Start the animation (looped playback by default). */  
  13.             ((AnimationDrawable) getBackground()).start();  
  14.         }  
  15.   
  16.         if (mLive) {  
  17.             /* monitor time ticks, time changed, timezone */  
  18.             IntentFilter filter = new IntentFilter();  
  19.             filter.addAction(Intent.ACTION_TIME_TICK);  
  20.             filter.addAction(Intent.ACTION_TIME_CHANGED);  
  21.             filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);  
  22.             mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);  
  23.         }  
  24.   
  25.         /* monitor 12/24-hour display preference */  
  26.         mFormatChangeObserver = new FormatChangeObserver();  
  27.         mContext.getContentResolver().registerContentObserver(  
  28.                 Settings.System.CONTENT_URI, true, mFormatChangeObserver);  
  29.   
  30.         updateTime();  
  31.     }  

另外在屏蔽Home键的时候也会用到

[java] view plain copy
  1. public void onAttachedToWindow() {  
  2. this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);  
  3. super.onAttachedToWindow();  
  4. }  


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

protected void onDetachedFromWindow()

Description copied from class: View
This is called when the view is detached from a window. At this point it no longer has a surface for drawing.
Overrides: 
onDetachedFromWindow in class AdapterView<ListAdapter>

将视图从窗体上分离的时候调用该方法。这时视图已经不具有可绘制部分。

 

onDetachedFromWindow()正好与onAttachedToWindow()的用法相对应,在destroy view的时候调用,所以可以加入取消广播注册等的操作,还是google的闹钟代码:

[java] view plain copy
  1. @Override  
  2.     protected void onDetachedFromWindow() {  
  3.         super.onDetachedFromWindow();  
  4.   
  5.         if (!mAttached) return;  
  6.         mAttached = false;  
  7.   
  8.         Drawable background = getBackground();  
  9.         if (background instanceof AnimationDrawable) {  
  10.             ((AnimationDrawable) background).stop();  
  11.         }  
  12.   
  13.         if (mLive) {  
  14.             mContext.unregisterReceiver(mIntentReceiver);  
  15.         }  
  16.         mContext.getContentResolver().unregisterContentObserver(  
  17.                 mFormatChangeObserver);  
  18.     }  


具体的用法视个人的需求而定了,自己控制重写就好了。



    本文转自 一点点征服   博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6867895.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android 当一个View 平移后,使他原来的位置可用。
Android 当一个View 平移后,使他原来的位置可用。
0 0
Android View动画和属性动画
Android View动画和属性动画
0 0
Android绘制竖直虚线完美解决方案—自定义View
开发中我们经常会遇到绘制虚线的需求,一般我们使用一个drawable文件即可实现,下面我会先列举常规drawable文件的实现方式。
0 0
Android自定义View水波纹
Android自定义View水波纹
0 0
内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和V
内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和V
0 0
Android自定义View-入门(明白自定义View和自定义ViewGroup)
为什么要自定义View? 主要是Andorid系统内置的View 无法实现我们的 需求,我们需要针对我们的业务需求定制我们想要的 View.
0 0
Android自定义View,制作饼状图带动画效果
一个简单的自定义view饼状图,加入了动画效果
0 0
Android进阶之绘制-自定义View完全掌握(四)
Android进阶之绘制-自定义View完全掌握(四)
0 0
Android进阶之绘制-自定义View完全掌握(三)
Android进阶之绘制-自定义View完全掌握(三)
0 0
Android进阶之绘制-自定义View完全掌握(二)
Android进阶之绘制-自定义View完全掌握(二)
0 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Android组件化实现
立即下载
蚂蚁聚宝Android秒级编译—— Freeline
立即下载
Android插件化:从入门到放弃
立即下载