专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
复利大王  ·  江浙沪美女留子回国下嫁怀孕后悔 ·  16 小时前  
复利大王  ·  旅行卖淫:白天陪玩晚上陪...警方:严厉打击 ·  16 小时前  
复利大王  ·  好牛的幼儿园 ·  昨天  
复利大王  ·  湘ya一骨科的瓜? ·  昨天  
复利大王  ·  老同学中捞一捞能不能找到免费P友 ·  昨天  
51好读  ›  专栏  ›  安卓开发精选

Android 视图架构详解

安卓开发精选  · 公众号  · android  · 2016-09-02 08:15

正文

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


context . getSystemService ( Context . WINDOW_SERVICE ),

mToken , mComponent . flattenToString (),

( info . flags & ActivityInfo . FLAG_HARDWARE_ACCELERATED ) != 0 );

.....

}


在attach()中,新建一个Window实例作为自己的成员变量,它的类型为PhoneWindow,这是抽象类Window的一个子类。然后设置mWindow的WindowManager。


Window,Activity和DecorView


DecorView是FrameLayout的子类,它可以被认为是Android视图树的根节点视图。DecorView作为顶级View,一般情况下它内部包含一个竖直方向的LinearLayout,在这个LinearLayout里面有上下两个部分(具体情况和Android版本及主体有关),上面的是标题栏,下面的是内容栏。在Activity中通过setContentView所设置的布局文件其实就是被加到内容栏之中的,而内容栏的id是content,在代码中可以通过ViewGroup content = (ViewGroup)findViewById(R.android.id.content)来得到content对应的layout。


Window中有几个视图相关的比较重要的成员变量如下所示:


  • mDecor:DecorView的实例,标示Window内部的顶级视图

  • mContentParent:setContetView所设置的布局文件就加到这个视图中

  • mContentRoot:是DecorView的唯一子视图,内部包含mContentParent,标题栏和状态栏。


Activity中不仅持有一个Window实例,还有一个类型为View的mDecor实例。这个实例和Window中的mDecor实例有什么关系呢?它又是什么时候被创建的呢?


二者其实指向同一个对象,这个对象是在Activity调用setContentView时创建的。我们都知道Activity的setContentView实际上是调用了Window的setContentView方法。


@Override

public void setContentView ( int layoutResID ) {

if ( mContentParent == null ) { //[window]如何没有DecorView,那么就新建一个

installDecor (); //[window]

} else if ( ! hasFeature ( FEATURE_CONTENT_TRANSITIONS )) {

mContentParent . removeAllViews ();

}

....

//[window]第二步,将layout添加到mContentParent

mLayoutInflater . inflate ( layoutResID , mContentParent );

.....

}


代码很清楚的显示了布局文件的视图是添加到mContentParent中,而且Window通过installDecor来新建DecorView。


//[window]创建一个decorView

private void installDecor () {

if ( mDecor == null ) {







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