Android中ViewStub控件分析及使用

在分析Android6.0源码时碰到以下一个布局

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>
    <ViewStub
        android:id="@+id/empty"
        android:layout="@layout/no_transfers"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>
</merge>

在布局中用到了一个叫做ViewStub的view,不甚理解,

我一直认为分析一个原生控件的最好办法就是查看源码以及demo演示,所以先看下ViewStub源码中的说明

根据源码可以获得以下信息

1,ViewStub继承自View

2,ViewStub默认是不可见(invisible)的,而且View的size为zero,即大小为0的view,用来在运行期间(runtime)加载布局

3,当一个ViewStub被设置成可见visible或者调用inflate()方法时,ViewStub得到填充,此时viewstub所引用的layout布局会代替掉viewstub控件显示出来,也就是说在调用setVisible(int)或者inflate()方法之前,UI中只有一个大小为0的viewstub。这对于布局的动态加载很有帮助

以上三点主要是总结来说就是viewstub默认不可见,在对布局进行加载时viewstub大小为0不占用任何的空间,当开发者在运行期间想让其动态显示时可以调用inflate()方法或者setVisible(int)来动态的加载布局,看到这里不得不佩服源码之强大,自己之不足。

关于ViewStub的用法,源码上已有介绍

     <ViewStub android:id="@+id/stub"
               android:inflatedId="@+id/subTree"
               android:layout="@layout/mySubTree"
               android:layout_width="120dip"
               android:layout_height="40dip" />

其用法其实类似include,其中android:layout属性用来引用所要动态加载的布局,通过id可以对ViewStub在代码中进行引用

在代码中通过id获取到对ViewStub的引用,然后调用inflate方法,调用该方法后mySubTree布局会代替ViewStub。ViewStub会被从它的parent中移除.通过inflateID:subTree可以在代码中引用到mySubTree

    ViewStub stub = (ViewStub) findViewById(R.id.stub);
     View inflated = stub.inflate();

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏君赏技术博客

Jekyll-Admin-Mac-模板处理

制作导航条 使用网络框架Alamofire 使用 SwiftyJSON iOS10开启启用 HTTP 请求 使用 ObjectMapper ...

12630
来自专栏熊二哥

Javascript快速入门(下篇)

Javascript, cheer up。 ? ? Ajax:其通过在Web页面与服务器之间建立一个额外的处理层,这个处理层就被称为Ajax引擎,它解释来自用...

21670
来自专栏ytkah

两个js冲突怎么解决?试试这四个方法

  两个js冲突很让前端头疼,虽然jquery是通用的,但调用不同经常会出问题。jQuery是目前流行的JS封装包,简化了很多复杂的JS程序,JQuery讲浏览...

73170
来自专栏Java学习网

Java实现自定义标签的步骤——带你实现自己的标签

一、自定义标签: 使用标签的好处:使用方便、简洁、实现代码重用 二、自定义标签的形式: 1、标签属性: 2、标签体 (1)无标签体――空标签 (2)有标签体 &...

57660
来自专栏Java成神之路

GEF入门实例_总结_03_显示菜单和工具栏

还记得上一节我们新建的类: ApplicationActionBarAdvisor 吗,这个类继承自 ActionBarAdvisor。

12320
来自专栏全栈

基于iView的列表组件封装

92220
来自专栏飞雪无情的博客

Android项目的目录结构

这两天家里晚上断网,不能晚上写了,请各位读官见谅。上一次我们使用ADT创建了一个Android的HelloWorld项目,并且介绍了模拟器以及模拟器的配置,这节...

8340
来自专栏郭霖

Android视图状态及重绘流程分析,带你一步步深入了解View(三)

在前面一篇文章中,我带着大家一起从源码的层面上分析了视图的绘制流程,了解了视图绘制流程中onMeasure、onLayout、onDraw这三个最重要步骤的工作...

300100
来自专栏DannyHoo的专栏

问题——持续更新

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

9520
来自专栏james大数据架构

.net页面生命周期

.net页面生命周期 (1)Page_Init();---初始化对象 这一过程主要是初始化包括页面本身的所有控件,每次的页面载入就会执行一次初试过程,而在这里面...

19470

扫码关注云+社区

领取腾讯云代金券