有时候,我们的页面中可能会包含一些布局,这些布局默认是隐藏的,当用户触发了一定的操作之后,隐藏的布局才会显示出来。比如,我们有一个Activity用来显示好友的列表,当用户点击Menu中的“导入”以后,在当前的Activity中才会显示出一个导入好友的布局界面。从需求的角度来说,这个导入功能,一般情况下用户是不使用的。即大部分时候,导入好友的布局都不会显示出来。这个时候,就可以使用延迟加载的功能。

ViewStub是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件。当ViewStub被设置为可见,或者调用inflate()函数时,才会真的去加载这个布局资源文件。该ViewStub在加载视图时会在父容器中替换它本身。因此,ViewStub会一直存在于视图中,直到调用setVisibility(int)或者inflate()为止。ViewStub的布局参数会随着加载的视图数一同被添加到ViewStub父容器。同样,也可以通过使用inflated Id属性来定义或重命名要加载的视图对象的Id值。

请参考下面的代码片段。

  1. <ViewStub
  2. android:id="@+id/stub_import"
  3. android:inflatedId="@+id/panel_import"
  4. android:layout="@layout/progress_overlay"
  5. android:layout_width="fill_parent"
  6. android:layout_height="wrap_content"
  7. android:layout_gravity="bottom" />

通过“stub_import”这个id可以找到被定义的ViewStub对象。加载布局资源文件“progress_overlay”后,ViewStub对象从其父容器中移除。可以通过“panel_import”这个id找到由布局资源“progress_overlay”创建的View。

执行加载布局资源文件的推荐方式如下:

  1. ((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
  2. // 或者
  3. View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();

当inflate()被调用, 这个ViewStub被加载的视图所替代,并且返回这个视图对象。这使得应用程序不需要额外执行findViewById()来获取加载视图的引用。

经验分享:

利用ViewStub可以与xml文件里面指定的布局资源文件关联起来,让布局资源文件在需要使用的时候再加载上去。什么时候用什么时候才加载,不用在开始启动的时候一次加载。这样做既可以加快应用的启动速度,又可以节省内存资源。

最新文章

  1. 破解Java to C# Converter
  2. EXPORT_SYMBOL的使用
  3. 一个简单的loading,纯属自娱自乐
  4. Nodejs基础中间件Connect
  5. Spring的DI(Ioc) - 注入bean 和 基本数据类型
  6. Xamarin 开发常见问题
  7. 【POJ2352】【树状数组】Stars
  8. 2px边框,4分之1内边框实现选中功能实现
  9. 一个简单的基于BIO的RPC框架
  10. 新概念英语(1-107)It&#39;s Too Small.
  11. ●POJ 1741 Tree
  12. JDBC事务控制
  13. 在Pycharm中使用Pandas时输出结果中列被省略的解决办法
  14. jQuery实现画面的展开、收起和停止
  15. ADC转换的分辨率
  16. 用 SQLite 和 FMDB 替代 Core Data
  17. 使用SQL语句如何实现条件判断
  18. C语言与数据库操作入门
  19. 7. myeclipse10反编译插件安装
  20. xcode 调试器 LLDB

热门文章

  1. java文件保存至服务器
  2. 动态规划 - 最长公共子序列(LCS)
  3. C++学习基础五之函数参数——形参
  4. 网络存储技术介绍(1) ( based on zt)
  5. 通过WinForm控件创建的WPF控件无法输入的问题
  6. Hibernate框架概念
  7. sql基础知识(新手必备)
  8. JavaScript系列:Date对象
  9. vnc
  10. 关于生物信息学与R的相关资料和网站