美文网首页
Activity View Window的联系

Activity View Window的联系

作者: 小锡兵鸥 | 来源:发表于2018-01-28 15:32 被阅读17次

    Activity View Window分别是什么?

    Activity : Android四大组件之一,存放View组件的容器,也是我们界面的载体,可以用来展示一个界面,它有一个setContentView()方法,可以将我们定义的布局设置到界面上。
    View : 这个类代表了用户界面组件的基本构件。
    Window: 抽象基类,用于顶级窗口外观和行为策略。The only existing implementation of this abstract class is android.view.PhoneWindow, which you should instantiate when needing a Window.

    Activity的setContentView()都做了哪些操作呢

    Activity.setContentView(intresId) 该方法在Activity类中,该方法只是简单的回调Window对象,具体为PhoneWindow对象的setContentView()方法实现。

    public void setContentView(@LayoutRes int layoutResID) {
        getWindow().setContentView(layoutResID);
        initWindowDecorActionBar();
    }
    
    public Window getWindow() { 
        return mWindow;   //Window对象,本质上是一个PhoneWindow对象 
    } 
    

    PhoneWindow.setContentView()方法

    ViewGroup mContentParent;
    
        @Override
    public void setContentView(int layoutResID) {
       ...
       //是否是第一次调用setContentView方法, 如果是第一次调用,则mDecor和mContentParent对象都为空  
        if (mContentParent == null) {
            installDecor();
        } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
        //如果没有设置过feature,移除其内部所有的子Views
            mContentParent.removeAllViews();
        }
        ...
    }
    

    mContentParent是个ViewGroup包含我们整个布局文件,installDecor就是去初始化mContentParent和创建DecorView

      private void installDecor() {
         if (mDecor == null) { //如果decorView为空,就生成一个
            mDecor = generateDecor(-1);
            ...
        }  else { //否则将phoneWindow设置到decorView上
            mDecor.setWindow(this);
        }
        if (mContentParent == null) { 
                //根据当前的主题设置根ViewGoup
            mContentParent = generateLayout(mDecor);
            ...
          } else {
                ...
          }
      }
    

    DecorView

        DecorView(Context context, int featureId, PhoneWindow window,
            WindowManager.LayoutParams params) {
        super(context);
        mFeatureId = featureId;
            ...
            //把Android系统中的非标准度量尺寸转变为标准度量尺寸
        updateAvailableWidth();
        setWindow(window);
        ...
    }
    

    至此,Activity、View、Window就联系在一起了。即通过setContentView()方法,创建DecorView,并将Window设置上,再利用该DecorView生成一个ViewGroup。
    可见,DecorView是核心。

    相关文章

      网友评论

          本文标题:Activity View Window的联系

          本文链接:https://www.haomeiwen.com/subject/kxfzaxtx.html