setContentView剖析[通俗易懂]

setContentView剖析[通俗易懂]1、setContentView的作用是将View加载到根view之上,这样当显示view时,先显示根view,然后在显示子view,以此类推,最终将所有view显示出来。2、setContentView必须要放在findviewbyid之前,因为view在加载之前是无法引用的。3、setContentView最本质的作用是为要显示的view分配内存。4、act

大家好,又见面了,我是你们的朋友全栈君。

1、setContentView的作用是将View加载到根view之上,这样当显示view时,先显示根view,然后在显示子view,以此类推,最终将所有view显示出来。


2、setContentView必须要放在findviewbyid之前,因为view在加载之前是无法引用的。

3、setContentView最本质的作用是为要显示的view分配内存。

4、activity、window和view之间的关系:

 而当我们运行程序的时候,有一个setContentView()方法,Activity其实不是显示视图(直观上感觉是它),实际上Activity调用了PhoneWindow的setContentView()方法,然后加载视图,将视图放到这个Window上,而Activity其实构造的时候初始化的是Window(PhoneWindow),Activity其实是个控制单元,即可视的人机交互界面。

打个比喻:

Activity是一个工人,它来控制Window;Window是一面显示屏,用来显示信息;View就是要显示在显示屏上的信息,这些View都是层层重叠在一起(通过infalte()和addView())放到Window显示屏上的。而LayoutInfalter就是用来生成View的一个工具,XML布局文件就是用来生成View的原料

activity调用setContentView其实是调用window的方法
在activity中:
    public void setContentView(int layoutResID) {

        getWindow().setContentView(layoutResID);

        initActionBar();

    }

在PhoneWindow类中:
    @Override

    public void setContentView(int layoutResID) {

        if (mContentParent == null) {


            installDecor();

        } else {

            mContentParent.removeAllViews();

        }


        mLayoutInflater.inflate(layoutResID, mContentParent);

        final Callback cb = getCallback();

        if (cb != null && !isDestroyed()) {

            cb.onContentChanged();

        }

    }

从上面代码可以看出,最终的根View就是
mContentParent,而mContentParent就是installDecor()生成的DecorView。

5、如何在一个activity中显示不同布局?

1)使用LayoutInflater inflate两个view:v1,v2
2)使用setContentView(View view)方法设置这两个view
具体讲解在http://blog.csdn.net/yanzi1225627/article/details/7802402






16
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153237.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Windows下 文件夹加密

    Windows下 文件夹加密此加密方法會使这个特殊的文件夹用正常情况不可打開也不可删除,可以起到保护重要资料的作用。  在Windows中“\”符号是路径的分隔符,比如“C:\Windows\System.exe”的意思是C分区的Windows文件夹中的System.exe文件。如果文件名中有“\”符号会怎么样呢?假如“sexinsex\”是一个文件夹的名字,这个文件夹位于“F:\”,它的路径就是“F:\sexinse…

    2022年7月13日
    25
  • pycharm需要什么配置_pycharm运行python

    pycharm需要什么配置_pycharm运行pythonPyCharm配置Gitee第一步:下载安装Git(安装一路Next就行)https://git-scm.com/download/win第二步:打开PyCharm,配置GitFile->Setting->搜索Git点击选择Git安装路径选择bin目录下的git.exe点击OK,git配置成功第三步:下载安装gitee在Setting中选择Plu…

    2022年10月21日
    5
  • 关于坑爹的编解码问题

    关于坑爹的编解码问题

    2021年5月26日
    118
  • Spring源码之Async注解

    Spring源码之Async注解spring@Async注解的处理

    2022年7月27日
    6
  • protel99se中文版

    protel99se中文版教程:1、解压压缩包,打开“Protel99SE”文件夹,双击“setup.exe”开始安装软件。2、输入用户信息,可以任意输入,然后输入3、选择软件的安装位置,建议默认,便于。4、选择安装类型,选择typical典型的进行安装。5、选择开始菜单文件夹,默认即可。6、准备安装软件,点击next。7、正在安装,请稍等一下。8、安装完成,资源地址:protel99se中文版…

    2022年5月7日
    68
  • 红帽linux修改root密码_deepin修改root密码

    红帽linux修改root密码_deepin修改root密码红旗linux超级管理员root密码恢复
     

     中科红旗redflag-linux6桌面版超级管理员root密码恢复
     1.—-启动电脑,出现linux系统的grut界面时候按“↓”上下方向键
     选择进入到RedFlag(2.66.22.1-9)界面,光标到最后1行
     2.—–BootOptionsroroot=LABEL=/vga=788splash=silent
     然后把它“BootOp

    2022年8月21日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号