当前位置:操作系统 > 安卓/Android >>

Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起

本文主要内容是讲解一个视图View或者一个ViewGroup对象是如何添加至应用程序窗口中的。
 
        下文中提到的窗口可泛指我们能看到的界面,包括一个Activity呈现的界面(我们可以将之理解为应用程序窗口),一个Dialog,
   一个Toast,一个Menu菜单等。
      首先对相关类的作用进行一下简单介绍:
 
         Window 类   位于/frameworks/base/core/java/android/view/Window.java
            说明:该类是一个抽象类,提供了绘制窗口的一组通用API。可以将之理解为一个载体,各种View在这个载体上显示。
             源文件(部分)如下:
 
public abstract class Window {   
    //... 
    //指定Activity窗口的风格类型 
    public static final int FEATURE_NO_TITLE = 1; 
    public static final int FEATURE_INDETERMINATE_PROGRESS = 5; 
     
    //设置布局文件 
    public abstract void setContentView(int layoutResID); 
 
    public abstract void setContentView(View view); 
 
    //请求指定Activity窗口的风格类型 
    public boolean requestFeature(int featureId) { 
        final int flag = 1<<featureId; 
        mFeatures |= flag; 
        mLocalFeatures |= mContainer != null ? (flag&~mContainer.mFeatures) : flag; 
        return (mFeatures&flag) != 0; 
    }     
    //... 

       PhoneWindow类  位于/frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindow.java
         说明: 该类继承于Window类,是Window类的具体实现,即我们可以通过该类具体去绘制窗口。并且,该类内部包含了
            一个DecorView对象,该DectorView对象是所有应用窗口(Activity界面)的根View。 简而言之,PhoneWindow类是
            把一个FrameLayout类即DecorView对象进行一定的包装,将它作为应用窗口的根View,并提供一组通用的窗口操作
            接口。
               源文件(部分)如下:         
 
public class PhoneWindow extends Window implements MenuBuilder.Callback { 
    //... 
    // This is the top-level view of the window, containing the window decor. 
    private DecorView mDecor;  //该对象是所有应用窗口的根视图 , 是FrameLayout的子类 
     
    //该对象是Activity布局文件的父视图,一般来说是一个FrameLayout型的ViewGroup  
    // 同时也是DecorView对象的一个子视图 
    // This is the view in which the window contents are placed. It is either 
    // mDecor itself, or a child of mDecor where the contents go. 
    private ViewGroup mContentParent;  
     
    //设置标题 
    @Override 
    public void setTitle(CharSequence title) { 
        if (mTitleView != null) { 
            mTitleView.setText(title); 
        } 
        mTitle = title; 
    } 
    //设置背景图片 
    @Override 
    public final void setBackgroundDrawable(Drawable drawable) { 
        if (drawable != mBackgroundDrawable || mBackgroundResource != 0) { 
            mBackgroundResource = 0; 
            mBackgroundDrawable = drawable; 
            if (mDecor != null) { 
                mDecor.setWindowBackground(drawable); 
            } 
        } 
    } 
    //...     

       DecorView类    该类是PhoneWindow类的内部类
         说明: 该类是一个FrameLayout的子类,并且是PhoneWindow的子类,该类就是对普通的FrameLayout进行功能的扩展,
            更确切点可以说是修饰(Decor的英文全称是Decoration,即“修饰”的意思),比如说添加TitleBar(标题栏),以及
            TitleBar上的滚动条等 。最重要的一点是,它是所有应用窗口的根View 。
         如下所示 :



\          

  \
  
              
           DecorView 根视图结构                                                          DecorView 根视图形式
    
     源文件(部分)如下:
 
private final class DecorView extends FrameLayout { 
    //... 
    //触摸事件处理 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
        return onInterceptTouchEvent(event); 
    } 
    //... 

 
 
       打个不恰当比喻吧,Window类相当于一幅画(抽象概念,什么画我们未知) ,PhoneWindow为一副齐白石先生的山水画
   (具体概念,我们知道了是谁的、什么性质的画),DecorView则为该
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,