View的context强转为Activity,一定是吗?

【参考:http://androidwing.net/index.php/225

问题:

view是写在xml里的,代码里面setContextView(),其实就是PhoneWindow的setContentView():

view是LayoutInflater解析xml反射出来的。view的context就是LayoutInflater的mContext:

这个LayoutInflater的context是PhoneWindow传进去的:

PhoneWindow的context就是Activity的this:

所以,也就是说,一个写在xml里的View,他的context就是Activity。 源码是这样告诉我的。可是为什么4.x都崩了呢,4.x的view的context到底是什么呢?

回答:
所有Appcompat的Activity,创建View的时候,都会对基本View做一个风格的包装,也就是说ImageView会变成AppcompatImageView。 那么实际上,imageView.context 是AppcompatImageView的getContext().
研究发现,AppcompatImageView并没有重写getContext()方法,那么到底怎么回事呢,直接看他的构造器:



卧槽,坑爹呢这是! 发现即使context传进来是个activity,也回被包装成TintContextWrapper。
那么为什么5.0以上系统,获得的还是一个Activity呢?
继续看:




nnd,原来如此,看样子是v7包为了能加载到一些特殊资源,给包裹成了TintContextWrapper。 所以强转出错!!!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,925评论 25 709
  • Day1: 在代码中通过R.string.hello_world可以获得该字符串的引用; 在XML中通过@stri...
    冰凝雪国阅读 1,467评论 0 5
  • 什么是灰度? 我现在经常和我6岁的女儿在一起看动画片,看的时候,我女儿经常就会问我,爸爸你说谁谁谁是好人还是坏人啊...
    happy的芋头阅读 2,880评论 0 5
  • 不要做宅男; 和面试官成为好朋友后再去面试(结果你懂的); 如何成为自由职业者; 假装自己能成功; 打造自身品牌:...
    逆天白阅读 188评论 0 0