专栏名称: 复利大王
分享和推送Java/Android方向的技术和文章,让你成为这方面的大牛,让你每天都成长一点。同时,我们也会邀请BAT的大牛分享原创!
目录
相关文章推荐
复利大王  ·  美女硕士被妈妈的驭男术坑了 ·  8 小时前  
复利大王  ·  青岛大所女律师cg事件 ·  8 小时前  
复利大王  ·  wtf,金融机构一个比一个乱 ·  2 天前  
复利大王  ·  坏了!突然被老板表白了 ·  2 天前  
复利大王  ·  这届清华状元就业开始疯狂下沉 ·  2 天前  
51好读  ›  专栏  ›  复利大王

教你读源码之探究Android界面的显示机制(我可能看到了假的视图等级)

复利大王  · 公众号  · android  · 2017-03-24 10:16

正文

请到「今天看啥」查看全文


public Window getWindow() {    
   return mWindow; }

mWindow是在哪初始化的呢 ?继续定位,我们发现是在Activiy的Attach方法进行的初始化,它是一个PhoneWindow类。

final void attach(Context context, ActivityThread aThread,        Instrumentation instr, IBinder token, int ident,        Application application, Intent intent, ActivityInfo info,        CharSequence title, Activity parent, String id,        NonConfigurationInstances lastNonConfigurationInstances,        Configuration config, String referrer,
      IVoiceInteractor voiceInteractor) {            attachBaseContext(context);//...省略一些代码            mWindow = new PhoneWindow(this);//...省略一些代码
}

所以,这里调用的的PhoneWindow的setContentView方法。

 public void setContentView(int layoutResID) { 
    //当mContentParent  为空的时候先构建DecorView,同时初始化mContentParent    if (mContentParent == null) {        installDecor();    } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {        mContentParent.removeAllViews();    }   //...省略一些代码       mLayoutInflater.inflate(layoutResID, mContentParent);
        //...省略一些代码
}

此处代码的意思是

1.如果mContentParent 为空的时候,这个时候要对DecorView进行初始化。

2.通过LayoutInflate服务将该ID对应的资源文件解析成view,并且添加到它的父view(mContentParent)中。

关于LayoutInflate服务将该ID对应的资源文件解析成view 这个过程(也就是mLayoutInflater.inflate(layoutResID, mContentParent);这个过程),可以关注我的后续博文(最近公司活比较多,没太多时间写)

再看一下initDecor()

 private void installDecor() {    
    if (mDecor == null) {        mDecor = generateDecor();//这里初始化DecorView         //...省略一些代码     }  
    if (mContentParent == null) {            mContentParent = generateLayout(mDecor);
            //这里产生了contentParentView              //...省略一些代码
}

在这里我们知道布局文件解析成的view必须添加到mContenParent这个view中,而而mContentParent是通过DecorView产生的,但是它们三者的关系是什么样的呢?

这里我们不从具体的代码分析了,分析过多容易晕,直接从应用显示的View视图进行分析。这里我们用了Hierarchy Viewer工具,

在层级图中,先找到我们自定义的布局,这是一个相对布局,其中包含了一个ImageView



继续向上,FrameLayout是什么?根据上文的理解,它直接包含了我们自定义的布局文件,应该就是mCotentParent这个view。




那和它并列的布局是什么呢?








请到「今天看啥」查看全文